当我阅读DelayQueue的源代码时,我认为DelayQueue
只是PriorityBlockingQueue
的特例,因此DelayQueue
可以通过包装{内部{1}}。
所以这就是我的问题,为什么PriorityBlockingQueue
内部不使用DelayQueue
? PriorityBlockingQueue
和DelayQueue
之间的区别是什么?
答案 0 :(得分:4)
DelayQueue
是BlockingQueue
的实现,其元素必须实现Delayed
接口,并且只能在特定时间后从Queue
中删除已经过去了(延迟)。
PriorityBlockingQueue
是BlockingQueue
的实现,其中元素的延迟不会影响其阻塞机制。 PriorityBlockingQueue
中的元素根据其自然顺序排列优先级,或者传递给其中一个构造函数的Comparator
。
当用户在空的时候尝试轮询它们时,Queue
都会阻塞,这意味着在向Queue
提供元素之前程序不会继续,很可能是在另一个线程上
您还必须注意DelayQueue
的元素不是通过Comparator
划分优先级,而是通过使用锁和监视器。
DelayQueue
使用支持PriorityQueue
,但仍需要编写自己的阻止机制,因为该实现与PriorityBlockingQueue
不同(当阻塞时,会通知提供的元素,它会立即返回给调用者。)