日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解java中DelayQueue的使用

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

簡介

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

DelayQueue

先看一下DelayQueue的定義:

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

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

Delayed繼承自Comparable,并且需要實現一個getDelay的方法。

為什么這樣設計呢?

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

DelayQueue的應用

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

首先要使用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是否大于當前系統時間,并將結果轉換成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()); }}

上面的對象中,我們需要實現getDelay和compareTo方法。

接下來我們創建一個生產者:

@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); } } }}

在生產者中,我們每隔0.5秒創建一個新的DelayedUser對象,并入Queue。

再創建一個消費者:

@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); } } }}

在消費者中,我們循環從queue中獲取對象。

最后看一個調用的例子:

@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(); }

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

線程池在5秒之后會被關閉。

運行看下結果:

[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,那么在線程池關閉之前插入的元素是不會過期的,也就是說消費者是無法獲取到結果的。

總結

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

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

以上就是詳解java中DelayQueue的使用的詳細內容,更多關于java DelayQueue的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
911亚洲精品| 国产欧美69| 黑人精品一区| 精品久久中文| 97精品一区| 人人香蕉久久| 日韩三区免费| 亚洲国产不卡| 在线精品一区| 日本少妇精品亚洲第一区| 国产日韩亚洲欧美精品| 欧美aaaaaa午夜精品| 日本激情一区| 国际精品欧美精品| 精品日韩视频| 午夜国产精品视频| 亚洲理论在线| 久久丁香四色| 精精国产xxxx视频在线野外| 久久理论电影| 亚洲一级淫片| 国产精品sm| 日韩国产一区二区三区| 欧美va亚洲va日韩∨a综合色| 国产精品老牛| 日韩av一二三| 国产videos久久| 亚洲无线一线二线三线区别av| 午夜日本精品| 日韩av字幕| 国产一区二区三区精品在线观看| 亚洲成人精品| 亚洲三级在线| 成人在线视频区| 亚洲主播在线| 久久精品国产999大香线蕉| av高清一区| 涩涩涩久久久成人精品| 精品视频高潮| 国产午夜久久| 国产精品久久亚洲不卡| 日韩精品午夜| 欧美日韩伊人| 欧洲av一区二区| 日韩精品一级| 久久精品亚洲人成影院| 日本aⅴ精品一区二区三区 | 99国产精品久久久久久久| 美美哒免费高清在线观看视频一区二区| 国产亚洲高清一区| 欧美一区三区| 日韩va亚洲va欧美va久久| 国产综合色区在线观看| 综合亚洲色图| 美女av在线免费看| 亚洲精品无吗| 色天使综合视频| 欧美天堂在线| 欧美在线资源| 久久免费福利| 亚州精品视频| 美女网站一区| 国产精品欧美一区二区三区不卡| 最新国产拍偷乱拍精品| 国内精品伊人| 日韩和欧美一区二区三区| 久久精品导航| 欧美激情视频一区二区三区免费 | 欧美/亚洲一区| 久久不见久久见免费视频7| 五月天综合网站| 久久精品国产亚洲一区二区三区| 欧美1区2区3区| 精品免费av一区二区三区| 先锋亚洲精品| 国产一区二区三区日韩精品| 视频一区国产视频| 新版的欧美在线视频| 欧美精品三级在线| 久久国产精品亚洲77777| 神马久久午夜| 精品黄色一级片| 欧美日韩调教| 中文字幕一区二区三区四区久久| 日韩欧美一区免费| 欧美精品91| 91麻豆精品| 免费国产亚洲视频| 久久精品一区二区不卡| 久久久久观看| 日韩1区2区日韩1区2区| 亚洲精品一区二区妖精| 欧美香蕉视频| 国内在线观看一区二区三区| 日本va欧美va瓶| 午夜在线一区| 午夜国产欧美理论在线播放| 国产欧美一区二区三区精品酒店| 日本成人中文字幕| 免费看精品久久片| 99xxxx成人网| 国产91精品对白在线播放| 成人国产精品一区二区免费麻豆| 国产精品久久久久久久久免费高清| 日韩在线观看一区二区| 激情欧美国产欧美| 亚洲播播91| 精品99在线| 久久久久久久欧美精品| 日韩高清成人| 国产伦久视频在线观看| 国产精品jk白丝蜜臀av小说| 日韩国产欧美视频| 蜜臀av一区二区在线免费观看 | 日韩欧美三级| 不卡专区在线| 91亚洲一区| 国产精品久久久亚洲一区| 日本va欧美va精品发布| 首页亚洲欧美制服丝腿| 欧美另类专区| 欧美91视频| 蜜臀av免费一区二区三区| 久久久久亚洲| 亚洲福利免费| 午夜国产精品视频免费体验区| 亚洲激情五月| 香蕉成人久久| 四虎精品一区二区免费| 日韩av中文字幕一区二区| 久久精品99国产精品日本| 国产精品片aa在线观看| 97久久精品| 美女高潮久久久| 国产一区二区三区视频在线| 黄色aa久久| 亚洲欧美综合| 蜜桃伊人久久| 日韩av字幕| 麻豆91在线播放| 中文在线а√天堂| 国产精品av久久久久久麻豆网| 99pao成人国产永久免费视频 | 国产亚洲精品精品国产亚洲综合| 国产精区一区二区| 精品久久久网| 日韩精品欧美| 久久国产精品久久久久久电车| 日韩在线电影| 欧美激情 亚洲a∨综合| 亚洲性色av| 免费一级片91| 国产黄色精品| 久久久久99| 一区二区三区网站| 国产精品v亚洲精品v日韩精品| www.九色在线| 天堂成人免费av电影一区| 久久狠狠久久| 日本少妇一区| 综合在线一区| 美女精品久久| 91成人网在线观看| 国产日韩欧美一区在线| 日韩电影二区| 中文字幕亚洲精品乱码| 久久精品午夜| 国产精品毛片| 免费一级欧美片在线观看网站 | 欧美三级网址| 亚洲专区视频| 国产色播av在线| 丝袜美腿亚洲色图| 久久这里只有精品一区二区| 婷婷亚洲综合| 国产精品密蕾丝视频下载| 欧美性感美女一区二区| 欧美视频久久| 久久精品高清| 88久久精品| 久久精品国产www456c0m| 日韩不卡一区二区| 日本在线精品| 国产香蕉精品| 欧美/亚洲一区| 国产精品夜夜夜| 好看不卡的中文字幕| 国产精品网站在线看| 激情91久久| 精品视频在线一区二区在线| 99亚洲视频| 中文在线免费视频| 日本色综合中文字幕| 欧美日韩激情| 国产成年精品| 国产亚洲一区二区三区不卡| 午夜精品亚洲| 四季av一区二区凹凸精品| 日韩精品国产精品| 欧美99久久|