DelayQueue多次接听电话

时间:2016-08-14 12:39:24

标签: java collections queue

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

1 个答案:

答案 0 :(得分: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]调用将阻止当前线程5s,然后返回第二个插入元素。 [2]将阻止当前线程持续55秒,然后返回第一个插入的元素。 [3] take调用将阻塞4分钟,最终返回最后插入的元素。

如果你想在多线程环境中使用DelayQueue,请注意它并不能保证公平性(如果调用take的线程按照它们调用的相同顺序提供服务,那将是公平的{ {1}}) - 它依赖于实现,在OpenJDK 7和8中它不使用公平锁实现 - 所以线程的服务顺序是任意的。