很多博客上说排在DelayQueue队列头部的是到期时间最短的,其实这种说法是不正确的。
实时到期时间(getDelay()方法的返回值) = 初始时间 + 到期时间 - 现在时间
这里假设A , B是并行的(及初始时间相同) ,初始时间为10秒,并且8秒后才执行
假设A线程到期时间为5秒 (即至少5秒后线程才能运行 , 实际可能是6秒或7秒后才执行)
实时到期时间 = 10 + 5 - (10 + 8) = -3 (负数表示已经过期了)
假设B线程设置到期时间为8秒
实时到期时间 = 10 + 8 - (10 + 8) = 0
A线程过期时间(delayExpiredTime)为3秒 , B线程过期时间为0秒 , 过期时间更长的线程先执行 , 所以A线程先执行
排在头部(head)的是过期时间最长的 , 而不一定是到期时间(delayTime)最短的(有可能A线程到期时间更短 , 但是A线程的初始时间比B线程更长)
如果没有一个对象过期,那么队列中就没有head(假设上面的例子只执行了4秒,A和B都没有过期,那么队列中是没有head的)。