电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

詳解java中DelayQueue的使用

瀏覽:5日期:2022-08-22 11:55:42

簡介

今天給大家介紹一下DelayQueue,DelayQueue是BlockingQueue的一種,所以它是線程安全的,DelayQueue的特點就是插入Queue中的數(shù)據(jù)可以按照自定義的delay時間進行排序。只有delay時間小于0的元素才能夠被取出。

DelayQueue

先看一下DelayQueue的定義:

public class DelayQueue<E extends Delayed> extends AbstractQueue<E> implements BlockingQueue<E>

從定義可以看到,DelayQueue中存入的對象都必須是Delayed的子類。

Delayed繼承自Comparable,并且需要實現(xiàn)一個getDelay的方法。

為什么這樣設計呢?

因為DelayQueue的底層存儲是一個PriorityQueue,在之前的文章中我們講過了,PriorityQueue是一個可排序的Queue,其中的元素必須實現(xiàn)Comparable方法。而getDelay方法則用來判斷排序后的元素是否可以從Queue中取出。

DelayQueue的應用

DelayQueue一般用于生產(chǎn)者消費者模式,我們下面舉一個具體的例子。

首先要使用DelayQueue,必須自定義一個Delayed對象:

@Datapublic class DelayedUser implements Delayed { private String name; private long avaibleTime; public DelayedUser(String name, long delayTime){ this.name=name; //avaibleTime = 當前時間+ delayTime this.avaibleTime=delayTime + System.currentTimeMillis(); } @Override public long getDelay(TimeUnit unit) { //判斷avaibleTime是否大于當前系統(tǒng)時間,并將結(jié)果轉(zhuǎn)換成MILLISECONDS long diffTime= avaibleTime- System.currentTimeMillis(); return unit.convert(diffTime,TimeUnit.MILLISECONDS); } @Override public int compareTo(Delayed o) { //compareTo用在DelayedUser的排序 return (int)(this.avaibleTime - ((DelayedUser) o).getAvaibleTime()); }}

上面的對象中,我們需要實現(xiàn)getDelay和compareTo方法。

接下來我們創(chuàng)建一個生產(chǎn)者:

@Slf4j@Data@AllArgsConstructorclass DelayedQueueProducer implements Runnable { private DelayQueue<DelayedUser> delayQueue; private Integer messageCount; private long delayedTime; @Override public void run() { for (int i = 0; i < messageCount; i++) { try {DelayedUser delayedUser = new DelayedUser( new Random().nextInt(1000)+'', delayedTime);log.info('put delayedUser {}',delayedUser);delayQueue.put(delayedUser);Thread.sleep(500); } catch (InterruptedException e) {log.error(e.getMessage(),e); } } }}

在生產(chǎn)者中,我們每隔0.5秒創(chuàng)建一個新的DelayedUser對象,并入Queue。

再創(chuàng)建一個消費者:

@Slf4j@Data@AllArgsConstructorpublic class DelayedQueueConsumer implements Runnable { private DelayQueue<DelayedUser> delayQueue; private int messageCount; @Override public void run() { for (int i = 0; i < messageCount; i++) { try {DelayedUser element = delayQueue.take();log.info('take {}',element ); } catch (InterruptedException e) {log.error(e.getMessage(),e); } } }}

在消費者中,我們循環(huán)從queue中獲取對象。

最后看一個調(diào)用的例子:

@Test public void useDelayedQueue() throws InterruptedException { ExecutorService executor = Executors.newFixedThreadPool(2); DelayQueue<DelayedUser> queue = new DelayQueue<>(); int messageCount = 2; long delayTime = 500; DelayedQueueConsumer consumer = new DelayedQueueConsumer(queue, messageCount); DelayedQueueProducer producer = new DelayedQueueProducer(queue, messageCount, delayTime); // when executor.submit(producer); executor.submit(consumer); // then executor.awaitTermination(5, TimeUnit.SECONDS); executor.shutdown(); }

上面的測試例子中,我們定義了兩個線程的線程池,生產(chǎn)者產(chǎn)生兩條消息,delayTime設置為0.5秒,也就是說0.5秒之后,插入的對象能夠被獲取到。

線程池在5秒之后會被關(guān)閉。

運行看下結(jié)果:

[pool-1-thread-1] INFO com.flydean.DelayedQueueProducer - put delayedUser DelayedUser(name=917, avaibleTime=1587623188389)[pool-1-thread-2] INFO com.flydean.DelayedQueueConsumer - take DelayedUser(name=917, avaibleTime=1587623188389)[pool-1-thread-1] INFO com.flydean.DelayedQueueProducer - put delayedUser DelayedUser(name=487, avaibleTime=1587623188899)[pool-1-thread-2] INFO com.flydean.DelayedQueueConsumer - take DelayedUser(name=487, avaibleTime=1587623188899)

我們看到消息的put和take是交替進行的,符合我們的預期。

如果我們做下修改,將delayTime修改為50000,那么在線程池關(guān)閉之前插入的元素是不會過期的,也就是說消費者是無法獲取到結(jié)果的。

總結(jié)

DelayQueue是一種有奇怪特性的BlockingQueue,可以在需要的時候使用。

本文的例子https://github.com/ddean2009/learn-java-collections

以上就是詳解java中DelayQueue的使用的詳細內(nèi)容,更多關(guān)于java DelayQueue的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 汝成内控-行政事业单位内部控制管理服务商 | 酒店品牌设计-酒店vi设计-酒店标识设计【国际级】VI策划公司 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 南京技嘉环保科技有限公司-杀菌除臭剂|污水|垃圾|厕所|橡胶厂|化工厂|铸造厂除臭剂 | 南昌旅行社_南昌国际旅行社_南昌国旅在线 | 数显水浴恒温振荡器-分液漏斗萃取振荡器-常州市凯航仪器有限公司 | 消防设施操作员考试报名时间,报名入口,报考条件 | 红酒招商加盟-葡萄酒加盟-进口红酒代理-青岛枞木酒业有限公司 | 生物颗粒燃烧机-生物质燃烧机-热风炉-生物颗粒蒸汽发生器-丽水市久凯能源设备有限公司 | 小小作文网_中小学优秀作文范文大全| 培训一点通 - 合肥驾校 - 合肥新亚驾校 - 合肥八一驾校 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | NM-02立式吸污机_ZHCS-02软轴刷_二合一吸刷软轴刷-厦门地坤科技有限公司 | 柴油发电机组_柴油发电机_发电机组价格-江苏凯晨电力设备有限公司 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | ph计,实验室ph计,台式ph计,实验室酸度计,台式酸度计 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 汽车润滑油厂家-机油/润滑油代理-高性能机油-领驰慧润滑科技(河北)有限公司 | 柔软云母板-硬质-水位计云母片组件-首页-武汉长丰云母绝缘材料有限公司 | 多功能三相相位伏安表-变压器短路阻抗测试仪-上海妙定电气 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 学生作文网_中小学生作文大全与写作指导 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 山东钢格板|栅格板生产厂家供应商-日照森亿钢格板有限公司 | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 隔爆型防爆端子分线箱_防爆空气开关箱|依客思 | 泥浆在线密度计厂家-防爆数字压力表-膜盒-远传压力表厂家-江苏大亚自控设备有限公司 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 定制液氮罐_小型气相液氮罐_自增压液氮罐_班德液氮罐厂家 | 山东聚盛新型材料有限公司-纳米防腐隔热彩铝板和纳米防腐隔热板以及钛锡板、PVDF氟膜板供应商 | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 佛山商标注册_商标注册代理|专利注册申请_商标注册公司_鸿邦知识产权 | 合肥展厅设计-安徽展台设计-合肥展览公司-安徽奥美展览工程有限公司 | 阻燃剂-氢氧化镁-氢氧化铝-沥青阻燃剂-合肥皖燃新材料 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | CNC机加工-数控加工-精密零件加工-ISO认证厂家-鑫创盟 | 北京四合院出租,北京四合院出售,北京平房买卖 - 顺益兴四合院 |