gpt4 book ai didi

Java:LinkedBlockingQueue 是否考虑了消费者的顺序?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:11:31 30 4
gpt4 key购买 nike

我有 3 个线程:2 个消费者,ConsumerAConsumerB,以及一个 Producer

我还有一个LinkedBlockingQueue队列

在 t=1 时:ConsumerA 调用 queue.take()

在 t=2:ConsumerB 调用 queue.take()

在 t=3 时:Producer 调用 queue.put(foo)

是否保证 ConsumerA 在 ConsumerB 之前收到 foo?换句话说,消费者调用take()的顺序就是每个消费者被通知的顺序?

如果没有,是否有替代数据结构可以根据顺序给予更高的优先级?

最佳答案

从查看源代码来看,并不能保证。有一个 protected block 机制,随机唤醒一个线程,具体取决于调度程序的感觉。

 notEmpty.signal(); // propagate to a non-interrupted thread

完整代码:http://kickjava.com/src/java/util/concurrent/LinkedBlockingQueue.java.htm

编辑:再次查看 ReenterantLock 和 Condition,显然,线程是按 FIFO 顺序发出信号的。因此,第一个等待插入的线程将首先收到信号。但是,这些是实现细节!不要依赖它们。

an implementation is not required to define exactly the same guarantees or semantics for all three forms of waiting, nor is it required to support interruption of the actual suspension of the thread

关于Java:LinkedBlockingQueue 是否考虑了消费者的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3339170/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com