【发布时间】:2013-05-17 16:51:45
【问题描述】:
我正在使用 BlockingQueue(LinkedBlockingQueue) 在多个线程之间同步数据。请看下面的图片。
主线程是一个生产者,它生产对象,然后将它们放入每个消费者的队列中(线程2-10)。需要强调的是,每个消费者都有自己的队列,并且每个产生的对象都会进入所有消费者的队列。
生产者的运行速度比消费者快得多,因此我们可以假设在消费者运行期间队列不应为空。当任何消费者的队列达到其容量时,生产者将被阻止(生产者使用put())。消费者使用take()从队列中取出对象。
使用此设置,我会假设消费者很少(如果可能的话)在队列为空时等待。但是,从我附在下面的图片中,我可以看到,有时,所有消费者都必须在队列中等待被对象填充;在等待期间,我可以看到生产者正在运行。
这不是我对BlockingQueue的理解,我以为只要生产者生产东西并放入队列,消费者就应该开始工作。为什么消费者线程有这么长的等待时间超出了我的理解。
有人可以解释一下吗?有没有简单的方法来分析这类应用程序?
【问题讨论】:
-
您是否尝试过使用包装队列和线程池的 ExecutorService?与使用现有库相比,您的系统有哪些优势?
-
和ExecutorService的框架有点不同。每个产生的对象都需要被所有的消费者线程处理。在 ExecutorService 中,只有一名工作人员会处理提交的作业。我愿意看看是否有任何调整 ExecutorService 以适应这种设计,但我还没有找到解决方案。
-
这是因为每个线程根据该对象执行不同的工作吗?您是否查看过 Disruptor 库,因为它旨在成为您尝试做的更高性能的版本。即将每个事件的工作拆分到多个线程中。
-
我的回答有帮助吗?如果是,请投票和/或接受。
标签: java concurrency java.util.concurrent