【问题标题】:DelayQueue multiple take callsDelayQueue 多个接听电话
【发布时间】:2016-08-14 12:39:24
【问题描述】:

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

【问题讨论】:

  • take 将等待第一个过期元素然后返回它,你不能在同一个线程中有多个 take 调用等待。如果你有几个接一个接一个的调用,那么它们将按过期顺序返回元素,
  • 好的,是第一个还是最后一个接收下一个元素的 take 调用?
  • 第一次调用会返回最先过期的元素。下一秒,以此类推。
  • 是否也需要打开一个新线程来等待下一个过期元素?还是暂停主线程?
  • 它暂停调用它的线程。

标签: java collections queue


【解决方案1】:

根据DelayQueue.take的javadoc:

检索并删除此队列的头部,如有必要等待 直到此队列中有一个具有过期延迟的元素可用。

是这样的:

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 中它不使用公平锁来实现 - 所以线程的服务顺序是任意的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 2015-10-12
    相关资源
    最近更新 更多