使用队列的生产者/消费者线程

2024-01-27

我想创建某种Producer/Consumer线程应用程序。但我不确定在两者之间实现队列的最佳方法是什么。

所以我有两个想法(这两个想法都可能是完全错误的)。我想知道哪个更好,如果它们都很糟糕那么实现队列的最佳方法是什么。我关心的主要是这些示例中队列的实现。我正在扩展一个 Queue 类,它是一个内部类并且是线程安全的。下面是两个示例,每个示例有 4 个类。

主班-

public class SomeApp
{
    private Consumer consumer;
    private Producer producer;

    public static void main (String args[])
    {
        consumer = new Consumer();
        producer = new Producer();
    }
} 

消费类——

public class Consumer implements Runnable
{
    public Consumer()
    {
        Thread consumer = new Thread(this);
        consumer.start();
    }

    public void run()
    {
        while(true)
        {
            //get an object off the queue
            Object object = QueueHandler.dequeue();
            //do some stuff with the object
        }
    }
}

制作人阶层——

public class Producer implements Runnable
{
    public Producer()
    {
        Thread producer = new Thread(this);
        producer.start();
    }

    public void run()
    {
        while(true)
        {
            //add to the queue some sort of unique object
            QueueHandler.enqueue(new Object());
        }
    }
}

队列类-

public class QueueHandler
{
    //This Queue class is a thread safe (written in house) class
    public static Queue<Object> readQ = new Queue<Object>(100);

    public static void enqueue(Object object)
    {
        //do some stuff
        readQ.add(object);
    }

    public static Object dequeue()
    {
        //do some stuff
        return readQ.get();
    }
}

OR

主班-

public class SomeApp
{
    Queue<Object> readQ;
    private Consumer consumer;
    private Producer producer;

    public static void main (String args[])
    {
        readQ = new Queue<Object>(100);
        consumer = new Consumer(readQ);
        producer = new Producer(readQ);
    }
} 

消费类——

public class Consumer implements Runnable
{
    Queue<Object> queue;

    public Consumer(Queue<Object> readQ)
    {
        queue = readQ;
        Thread consumer = new Thread(this);
        consumer.start();
    }

    public void run()
    {
        while(true)
        {
            //get an object off the queue
            Object object = queue.dequeue();
            //do some stuff with the object
        }
    }
}

制作人阶层——

public class Producer implements Runnable
{
    Queue<Object> queue;

    public Producer(Queue<Object> readQ)
    {
        queue = readQ;
        Thread producer = new Thread(this);
        producer.start();
    }

    public void run()
    {

        while(true)
        {
            //add to the queue some sort of unique object
            queue.enqueue(new Object());
        }
    }
}

队列类-

//the extended Queue class is a thread safe (written in house) class
public class QueueHandler extends Queue<Object>
{    
    public QueueHandler(int size)
    {
        super(size); //All I'm thinking about now is McDonalds.
    }

    public void enqueue(Object object)
    {
        //do some stuff
        readQ.add();
    }

    public Object dequeue()
    {
        //do some stuff
        return readQ.get();
    }
}

And go!


Java 5+ 拥有完成此类任务所需的所有工具。您会想要:

  1. 将所有制作人合二为一ExecutorService https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html;
  2. 将所有消费者放在另一个消费者中ExecutorService;
  3. 如有必要,可以使用以下方式在两者之间进行通信BlockingQueue https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html.

我对(3)说“如果有必要”,因为根据我的经验,这是一个不必要的步骤。您所做的就是向消费者执行器服务提交新任务。所以:

final ExecutorService producers = Executors.newFixedThreadPool(100);
final ExecutorService consumers = Executors.newFixedThreadPool(100);
while (/* has more work */) {
  producers.submit(...);
}
producers.shutdown();
producers.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
consumers.shutdown();
consumers.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);

So the producers直接提交至consumers.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用队列的生产者/消费者线程 的相关文章

  • 使用 proguard 混淆文件名

    我正在使用 proguard 和 Android Studio 混淆我的 apk 当我反编译我的apk时 我可以看到很多文件 例如aaa java aab java ETC 但我项目中的所有文件都有原始名称 有没有办法混淆我的项目的文件名
  • 以相反的顺序打印任何集合中的项目?

    我在 使用 Java 进行数据结构和问题解决 一书中遇到以下问题 编写一个例程 使用 Collections API 以相反的顺序打印任何 Collection 中的项目 不要使用 ListIterator 我不会把它放在这里 因为我想让有
  • Java LostFocus 和 InputVerifier,按反向制表符顺序移动

    我有一个 GUI 应用程序 它使用 InputVerifier 在产生焦点之前检查文本字段的内容 这都是很正常的 然而 昨天发现了一个问题 这似乎是一个错误 但我在任何地方都找不到任何提及它的地方 在我将其报告为错误之前 我想我应该问 我在
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • 单线程程序中可以有竞争条件吗?

    您可以在here https en wikipedia org wiki Race condition Software关于什么是竞争条件的一个很好的解释 我最近看到很多人对竞争条件和线程做出了令人困惑的陈述 我了解到竞争条件只能发生在线程
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • 为什么 jar 执行的通配符在 docker CMD 中不起作用?

    我有一个Dockerfile与以下CMD启动我的 Spring Boot 应用程序 FROM java 8 jre CMD java jar app file jar 当我尝试从创建的图像启动容器时 我得到 Error Unable to
  • 如何使用双重调度来分析图形基元的交集?

    我正在分析图形基元 矩形 直线 圆形等 的交互并计算重叠 相对方向 合并等 这被引用为双重调度的一个主要示例 例如维基百科 http en wikipedia org wiki Double dispatch 自适应碰撞算法通常要求 不同的
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 按降序排序映射java8 [重复]

    这个问题在这里已经有答案了 private static
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 使用 Apache 允许 Glassfish 和 PHP 在同一服务器中协同工作

    是否可以建立从 Java 到 php 文件的桥梁 我有一个用 Java 编写的应用程序 我需要执行http piwik org http piwik org 这是用 PHP 编写的 在服务器中 我正在运行 PHP 但无法从浏览器访问 php
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • 设置 TreeSet 的大小

    有没有办法像数组一样对 Java 集合中的 TreeSet 进行大小限制 例如我们在数组中 anArray new int 10 数组具有固定长度 在创建数组时必须指定该长度 A TreeSet当您向其中添加元素时会自动增长 您无法设置其大

随机推荐

  • Appium服务器未检测到通过wifi连接的设备

    did adb tcpip 5555 and adb connect ipaddress The adb devices显示设备 但是当我运行 appium 服务器时 它显示没有连接 Android 设备 appium python代码是
  • 什么是 Packrat 解析?

    我知道并使用 bison yacc 但在解析世界中 围绕 Packrat 解析有很多讨论 它是什么 值得学习吗 Packrat 解析是一种提供渐近更好的性能 for 解析表达式语法 http en wikipedia org wiki Pa
  • 从 Firestore 导出 json

    由于我们可以在Firebase RTDB控制台下载json文件 有什么方法可以导出Firestore集合 文档数据的json文件 我的主要目标之一是比较更新文档之前 之后的数据 谷歌让它变得比需要的更加困难 所以社区找到了一个解决方法 如果
  • 将平面拟合到 3D 中的一组点:scipy.optimize.minimize 与 scipy.linalg.lstsq

    给定一组 3D 点 一般问题是找到a b c平面方程的系数 形式为 z a x b y c 这样得到的平面就是best fit可能到那组点 In 这个答案 https stackoverflow com a 20700063 1391441
  • 如何让表单元素“记住”选择?

    我现在正在使用 php 构建一个 更改分类 页面 我使用Mysql作为数据库 目前我使用PHP来获取有关分类的所有mysql信息 然后我像这样输出 table
  • Microsoft Edge 的 URL 长度限制

    有人知道 Microsoft Edge 的 URL 长度限制吗 如您所知 Internet Explorer 对 URL 长度有限制 最大长度为 2048 Edge 怎么样 我想 现在应该已经消失了 极限似乎已到81578 个字符 之后 我
  • 如何使用Ramda管道?

    背景 我正在尝试使用 Ramda 编写 2 个函数 但我遇到了问题pipe 这意味着我不知道如何使用它 Code 假设我有一个返回数组的函数 var createQuery params gt getSQLQuery params getM
  • 断言失败:电影播放器​​的激活状态错误 (1)

    我正在 iPad 应用程序的一个页面上播放视频 m4v 然后它会转到另一个视图控制器来播放另一个视频 它播放正常 但是当第二个视频播放完毕时 它会抛出断言失败 错误是 Assertion failure in MPMoviePlayerCo
  • Getx Flutter - 更新列表中的项目不是反应性的

    我使用 getx 作为我的 flutter 应用程序的状态管理 但我在更新列表中的值时遇到困难 所以我有一个参数为 isFollowing 的用户模型 当我单击按钮时 isFollowing 变量将发生变化并且颜色也应更新 但这并没有发生
  • 放置 libgdx Screen 的正确位置在哪里

    您好 我正在开发一款游戏 我想知道如何处理资源 因为我遇到了内存问题 我有这样的事情 public SplashScreen implements Screen Override public void render float delta
  • Flexbox - 垂直居中并匹配大小

    我使用 Flex 有两个相邻的按钮 并且它们的内容垂直居中 到目前为止效果很好 但是 当在移动页面上查看我的网站时 使用响应式设计来缩放页面 第二个按钮 其中的文本较少 的大小会与其同伴的大小不同 因此 目标是垂直对齐按钮上的文本 并使两个
  • 投票 - 阻止客户端滥用 - ASP.NET MVC

    所以我设计了这个投票的东西 它不会让某人在 24 小时内为同一篇文章投票两次 然而 假设一个人投票 并且在看到该人能够投票或者他处于 24 小时窗口内之后 我禁用投票按钮 顺便说一句 这都是 Ajax 但是 当一个人关闭浏览器并重新打开甚至
  • tsql函数分割字符串

    我想知道是否有人可以帮助我 我需要一个 sql 函数来分割给定值 例如 1 00 Not specified 3 01 05 Global WM BB Operations 2 02 05 01 Global WM BB Operation
  • 从 Eclipse PDT 转换为 Vim [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我真的很喜欢 VIM 它是我遇到过的少数几个能让你内心感到温暖和模糊的应用程序之一 然而 对于 PHP
  • 如何在 thenOpen 中获取 casper.js 中的响应状态 404 而不是 undefined?

    知道为什么下面的代码在任何一个中都没有捕获 404responsevar 或在http status 404 event 我使用 phantomjs 1 9 casperjs 1 0 2 和 Windows 7 运行此程序 var casp
  • 是否可以对 Xcode 项目的“构建阶段”部分中的“编译源”列表进行排序?

    我想根据名称对 Xcode 项目的 编译源 部分中的文件进行排序 是否可以 是的 您可以重新订购编译源Xcode 中的部分 但不是 GUI 中的部分 考虑到这已经是 IDE 的第 6 版 而且他们仍然没有解决这个基本功能 这很遗憾 正如 A
  • 如何在 Meteor Spacebars 模板中重复块 N 次?

    我在空格键模板中有这段代码 1
  • Lubridate 未在 R 中正确将日期时间转换为 POSIXct (dd/mm/yy hh:mm:ss) [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在尝试将日期时间从 csv 转换为 POSIXct 以进行数据分析 我已经尝试了多个代码 但要么得到 NA 要么格式错误 我当
  • pandas:根据另一个数据框的列选择数据框列

    我正在尝试对 a 进行子集化pandas基于另一个类似数据框中的列的数据框 我可以在 R 中轻松做到这一点 df1 lt data frame A 1 5 B 6 10 C 11 15 df2 lt data frame A 1 5 B 6
  • 使用队列的生产者/消费者线程

    我想创建某种Producer Consumer线程应用程序 但我不确定在两者之间实现队列的最佳方法是什么 所以我有两个想法 这两个想法都可能是完全错误的 我想知道哪个更好 如果它们都很糟糕那么实现队列的最佳方法是什么 我关心的主要是这些示例