参考:https://developer.aliyun.com/article/913677
延迟队列DelayQueue,里面的元素需要实现Delayed接口,需要写 long getDelay(TimeUnit unit); 方法。
里面实际是PriorityQueue,优先级队列, 使用的堆排序,就是一个二叉树,
小堆,就是小值在上面, 大堆,就是大值在上面。 堆中每个节点的值都必须小于等于(或者大于等于)其子节点的值 左右兄弟节点,不一定谁大。
add节点时,放到队列尾部,就是树的最底下,最右边,然后顺着树, 从下往上比较,确定位置。
poll节点时,直接拿走头节点,然后把尾节点放到头节点,然后从上往下比较, 跟两个子节点较小的那个,互换位置,如此反复,直到下沉确定位置。
由于add或poll时,不是整个树的完全排序, 所以存在可能性,某个节点位置特殊,一直没有变化位置, 也就一直无法出列(只有移动到头部才能出列)
getDelay()方法只有比较位置时才会调用。注意!!
|