java中DelayQueue实例用法详解
在阻塞队里中,除了对元素进行增加和删除外,我们可以把元素的删除做一个延迟的处理,即使用DelayQueue的方法。这里的删除需要一定的时间才能生效,有点类似于过期处理的理念。下面我们就DelayQueue的概念、特点进行讲解,然后在代码示例中体会DelayQueue的使用。
1.概念
是一个带有延迟时间的无界阻塞队列。队列中的元素,只有等延时时间到了,才能取出来。此队列一般用于过期数据的删除,或任务调度。以下,模拟一下定长时间的数据删除。
2.特点
(1)无边界设计
(2)添加(put)不阻塞,移除阻塞
(3)元素都有一个过期时间
(4)取元素只有过期的才会被取出
3.实例
每个需要放入DelayQueue队列元素需要实现Delayed接口,下面我们创建DelayObject类,其实例对象将被放入DelayQueue中。其构造函数包括字符串类型数据及延迟毫秒变量。
publicclassDelayObjectimplementsDelayed{ privateStringdata; privatelongstartTime; publicDelayObject(Stringdata,longdelayInMilliseconds){ this.data=data; this.startTime=System.currentTimeMillis()+delayInMilliseconds; }
DelayQueue的应用实例
packageorg.dromara.hmily.demo.springcloud.account.service; importjava.time.LocalDateTime; importjava.time.format.DateTimeFormatter; importjava.util.concurrent.DelayQueue; importjava.util.concurrent.Delayed; importjava.util.concurrent.TimeUnit; /** *@description:延时队列测试 *@author:hh */ publicclassDelayedQueneTest{ publicstaticvoidmain(String[]args)throwsInterruptedException{ Itemitem1=newItem("item1",5,TimeUnit.SECONDS); Itemitem2=newItem("item2",10,TimeUnit.SECONDS); Itemitem3=newItem("item3",15,TimeUnit.SECONDS); DelayQueue- queue=newDelayQueue<>(); queue.put(item1); queue.put(item2); queue.put(item3); System.out.println("begintime:"+LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); for(inti=0;i<3;i++){ Itemtake=queue.take(); System.out.format("name:{%s},time:{%s}\n",take.name,LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME)); } } } classItemimplementsDelayed{ /*触发时间*/ privatelongtime; Stringname; publicItem(Stringname,longtime,TimeUnitunit){ this.name=name; this.time=System.currentTimeMillis()+(time>0?unit.toMillis(time):0); } @Override publiclonggetDelay(TimeUnitunit){ returntime-System.currentTimeMillis(); } @Override publicintcompareTo(Delayedo){ Itemitem=(Item)o; longdiff=this.time-item.time; if(diff<=0){//改成>=会造成问题 return-1; }else{ return1; } } @Override publicStringtoString(){ return"Item{"+ "time="+time+ ",name='"+name+'\''+ '}'; } }
运行结果:每5秒取出一个
begintime:2019-05-31T11:58:24.445 name:{item1},time:{2019-05-31T11:58:29.262} name:{item2},time:{2019-05-31T11:58:34.262} name:{item3},time:{2019-05-31T11:58:39.262}
到此这篇关于java中DelayQueue实例用法详解的文章就介绍到这了,更多相关java中DelayQueue是什么内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!