gpt4 book ai didi

java - DelayQueue 多个 take 调用

转载 作者:行者123 更新时间:2023-12-01 09:35:50 25 4
gpt4 key购买 nike

我将在模拟 parking 场的程序中使用 Collections 接口(interface)中的 DelayQueue。我想知道在没有元素过期的情况下是否有多个 take 方法调用队列,最后一个 take 调用是否返回最先出现的元素,或者是否返回先前调用的 take 之后出现的元素?

最佳答案

根据 DelayQueue.take 的 javadoc:

Retrieves and removes the head of this queue, waiting if necessary until an element with an expired delay is available on this queue.

就是这样的:

DelayQueue<DelayedSomething> q = new DelayQueue<>();

q.offer(somethingExpiringIn60s);
q.offer(somethingExpiringIn5s);
q.offer(somethingExpiringIn5min);

DelayedSomething shouldBeSomethingExpiringIn5s = q.take(); //[1]
DelayedSomething shouldBeSomethingExpiringIn60s = q.take(); //[2]
DelayedSomething shouldBeSomethingExpiringIn5min = q.take(); //[3]

将像这样工作 - [1] 调用将阻塞当前线程 5 秒,然后返回第二个插入的元素。 [2] 会阻塞当前线程 55 秒,然后返回第一个插入的元素。 [3] take 调用将阻塞 4 分钟,最终返回最后插入的元素。

如果您想在多线程环境中使用 DelayQueue,请注意,它不能保证公平性(如果调用 take 的线程将在与他们称为 take 的顺序相同) - 它依赖于实现,并且在 OpenJDK 7 和 8 中它不使用公平锁来实现 - 因此线程的服务顺序是任意的。

关于java - DelayQueue 多个 take 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38942350/

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