1、结构
使用的是PriorityQueue来作为底层的存储
元素需要实现Delayed接口,该接口继承了comparable接口
DelayQueue的队头元素是根据comparable排在队首的元素
无论是入队还是出队都是先加锁,也就是异步进行的。
2、add,put,offer操作底层都是调的offer。
offer操作因为加锁是异步进行的,而且发现加入后的元素是自己的时候进行signal(),而不是signalAll()
为什么调用signal?出队的操作没有await
3、remove,poll,peek,take都会加锁
remove 操作不管时间是否已经到了,都会删除.
poll操作只有delay到了才会删除。
peek也加锁,但是不会判断是否已经到delay时间,只是调priorityQueue.peek()。
take操作会阻塞。