我正在使用BlockingQueue(LinkedBlockingQueue)在多个线程之间同步数据。请看下面的图片。
主线程是一个生产者,它生成对象,然后将它们放入每个Consumer的队列中(线程2-10)。需要强调的是,每个消费者都有自己的队列,每个生成的对象都会转到所有消费者的队列。
生产者的运行速度比消费者快得多,因此我们可以假设在消费者运行期间队列不应为空。当任何消费者的队列达到其容量时,生产者将被阻止(生产者使用put()
)。 Consumer使用take()
从队列中获取对象。
使用此设置,我会假设消费者很少(如果可能的话)在队列为空时等待。但是,从我下面附上的图片中,我可以看到,所有消费者不时要等待队列中的物体;在等待期间,我可以看到生产者正在运行。
这不是我对BlockingQueue的理解,我假设只要生产者生产并放入队列,消费者就应该开始工作了。为什么在消费者线程上有这么大的等待时间是我无法理解的。
有人能解释一下吗?有没有简单的方法来描述这种应用程序?
答案 0 :(得分:1)
这不是我对BlockingQueue的理解,我假设只要生产者生产并放入队列,消费者就应该开始工作了。为什么在消费者线程上有这么大的等待时间超出了我的理解。
这很可能是 BlockingQueue
您可能不正确,生产商落后于消费者。也许制作人正在破裂,曾经有一段时间从装载的磁盘中读取并落后。
也许消费者阻止某些其他对象,而不是BlockingQueue
。消费者对数据做了什么?他们是将其写入磁盘还是通过网络发送?他们做的任何其他可以阻止的操作?
另一种可能性是只有几个线程跟上生产者,因此许多线程在LIFO线程顺序中等待。换句话说,如果一个线程刚刚完成,可能需要生成器添加的最新元素。所以一些线程保持忙碌而其他线程更多地被阻塞。我不确定你的队列是如何实现的。
有没有简单的方法来描述这种应用程序?
要做的一件事是查看堆栈跟踪以查看其中每个线程被阻止的位置。如果您的线程实际上正在等待阻塞队列,这将使您更好地了解。您可以使用jconsole实时查看线程或经常发送QUIT
信号。