三 : DelayQueue 延迟队列

来源:互联网 发布:设计师用的软件 编辑:程序博客网 时间:2024/05/21 10:27

1. 延迟队列 DelayQueue

它是包含Delayed 元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部 是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且 poll 将返回 null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于等于 0 的值时,将发生到期。即使无法使用 take 或 poll 移除未到期的元素,也不会将这些元素作为正常元素对待。例如,size 方法同时返回到期和未到期元素的计数。此队列不允许使用 null 元素。 

该实现类有两个构造函数 , 一个为无参构造函数 , 一个为Collection类的参数。



2.  该实现类的 add 方法





可以看出 ,DelayBlockingQueue实现类的add方法,内部是由优先级阻塞队列实现的。 具体参考优先级阻塞队列


3.该实现类的take方法



4. 代码实现


public class Delay
{
private class Stadium implements Delayed
{
long trigger;


public Stadium(long i)
{
trigger = System.currentTimeMillis() + i;
}


@Override
public long getDelay(TimeUnit arg0)
{
long n = trigger - System.currentTimeMillis();
return n;
}


@Override
public int compareTo(Delayed arg0)
{
return (int) (this.getDelay(TimeUnit.MILLISECONDS) - arg0.getDelay(TimeUnit.MILLISECONDS));
}


public long getTriggerTime()
{
return trigger;
}
}



public static void main(String[] args) throws Exception
{
Random random = new Random();
DelayQueue<Stadium> queue = new DelayQueue<Stadium>();
Demo09 t = new Demo09();


for (int i = 0; i < 5; i++)
{
queue.add(t.new Stadium(random.nextInt(30000)));
}
Thread.sleep(2000);


while (true)
{
Stadium s = queue.take();//延时时间未到就一直等待  
if (s != null)
{
System.out.println(System.currentTimeMillis() - s.getTriggerTime());//基本上是等于0  
}
if (queue.size() == 0) break;
}
}
}


0 0