0

我一直在阅读有关阻塞队列的内容,并且出现了某些问题。我读过的所有例子都只展示了只有一个消费者和一个生产者线程的情况。问题是:假设我们有 1 个生产者和 3 个消费者,并且在当前时刻,所有消费者都被调用了 take() 方法,但是队列是空的,所以他们都在等待出现第一个元素。哪个消费者线程会在第一个元素出现时获取它?首先调用 take() 的消费者线程?

4

4 回答 4

2

不知道你能不能说出来。真正的问题是:为什么你需要知道?所有的听众都应该是等价的。由哪一个处理请求并不重要。如果您必须知道,那么您设计和实现它是错误的。

于 2013-04-08T13:49:13.130 回答
2

检查 ArrayBlockingQueue(int capacity, boolean fair) fair 是否为真,然后按 FIFO 顺序处理在插入或删除时阻塞的线程的队列访问。

于 2013-04-08T13:51:58.773 回答
1

哪个消费者线程会在第一个元素出现时获取它?首先调用 take() 的消费者线程?

这与阻塞队列实现以及有问题的 JVM 相关,但简短的回答很可能是肯定的。每个线程都将等待一个条件,当条件发出信号时,等待队列中的第一个线程将被唤醒。

也就是说,您不应该依赖此功能,因为它非常依赖于相关阻塞队列的细节以及 JVM 和操作系统版本。

于 2013-04-08T13:49:24.943 回答
1

我同意 duffymo 的观点,让多个线程无限期地等待一些新元素在队列中弹出的想法听起来结构不太好。

此外,如果您需要知道哪个消费者删除了元素,这让我认为消费者实际上在做不同的事情,根据消费者执行拍摄的顺序,在不同的场景下赋予不同的输出生命( )。如果是这种情况,您可能希望为不同的线程设置不同的队列。

如果您不打算更改代码,那么让线程定期执行轮询怎么样?

于 2013-04-08T14:21:45.710 回答