我将在模拟停车场的程序中使用Collections界面中的DelayQueue。我想知道在没有元素过期的情况下是否有多个take方法调用队列,最后一次调用是否返回先出现的元素,还是返回之前调用take后出现的元素?
答案 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中它不使用公平锁实现 - 所以线程的服务顺序是任意的。