我一直在阅读有关阻止队列和某些问题的文章。我读过的所有示例都只展示了只有一个使用者和一个生产者线程的情况。问题是:假设我们有1个生产者和3个消费者,并且在当前时刻所有消费者都被称为take()方法,但队列是空的,所以他们都在等待出现第一个元素。哪个消费者线程会出现第一个元素?首先调用take()的消费者线程?
答案 0 :(得分:2)
我不知道你能说出来吗。真正的问题是:你为什么需要知道?所有听众都应该是等同的。处理请求的哪一个无关紧要。如果您必须知道,那么您的设计和实施方式都不正确。
答案 1 :(得分:2)
检查ArrayBlockingQueue(int capacity, boolean fair)
如果fair为true,则插入或删除时阻塞的线程的队列访问将按FIFO顺序处理。
答案 2 :(得分:1)
哪个消费者线程会出现第一个元素?首先调用take()的消费者线程?
这与阻塞队列实现以及有问题的JVM有关,但简短的回答很可能是肯定的。每个线程都将在一个条件上等待,并且当条件被发出信号时,将唤醒等待队列中的第一个线程。
那就是说,你不应该依赖这个功能,因为它非常依赖于所讨论的阻塞队列的细节以及JVM和OS版本。
答案 3 :(得分:1)
我同意duffymo,让多个线程无限期地等待队列中弹出一些新元素的想法听起来不太合理。
此外,如果您需要知道哪个消费者删除了该元素,那么我会认为消费者实际上在做不同的事情,根据消费者执行的顺序为不同的场景赋予不同的生命。 take()。如果是这种情况,您可能希望为不同的线程设置不同的队列。
如果您不打算更改代码,那么让线程定期执行投票怎么办?