Java線程池隊(duì)列DelayQueue的使用詳解
Java線程池隊(duì)列DelayQueue的使用及詳細(xì)介紹
一、什么是DelayQueue?
DelayQueue顧名思義,它是個(gè)無(wú)邊界延遲隊(duì)列,它的底層是基于PriorityBlockingQueue實(shí)現(xiàn)的。
該隊(duì)列中的元素都是按照過(guò)期時(shí)間順序排序的,隊(duì)列頭部放的是即將過(guò)期的元素。
該隊(duì)列中的元素必須實(shí)現(xiàn)Delayed接口,getDelay定義了剩余到期時(shí)間,compareTo方法定義了元素排序規(guī)則。
該隊(duì)列不允許存放null元素。延時(shí)隊(duì)列實(shí)現(xiàn)了Iterator接口,但I(xiàn)terator()遍歷順序不保證是元素的實(shí)際存放順序。
總結(jié)
- DelayQueue隊(duì)列是無(wú)邊界
- 隊(duì)列中按照過(guò)期時(shí)間排序
- 隊(duì)列中的元素必須實(shí)現(xiàn)Delayed接口
- 不允許存放null元素
- poll方法獲取元素時(shí),立即返回,如果沒(méi)有過(guò)期的元素則返回null
- take方法獲取元素時(shí),如果沒(méi)有過(guò)期的元素則會(huì)進(jìn)行阻塞
- peek方法獲取元素時(shí),立即返回,不會(huì)刪除該元素,即使沒(méi)有過(guò)期的元素也會(huì)獲取到
- 使用Iterator可以立即返回該隊(duì)列中的元素,但是不保證順序
二、案例
package com.brycen.part3.threadpool.collections; import java.util.Iterator; import java.util.concurrent.*; public class DelayQueueExample { public static void main(String[] args) throws InterruptedException { DelayQueue<DelayElement> delayQueue = new DelayQueue<>(); delayQueue.add(new DelayElement<String>("test1",1000)); delayQueue.add(new DelayElement<String>("test2",800)); delayQueue.add(new DelayElement<String>("test3",2000)); delayQueue.add(new DelayElement<String>("test4",3000)); System.out.println("隊(duì)列大?。?+delayQueue.size()); //立即返回,同時(shí)刪除元素,如果沒(méi)有過(guò)期元素則返回null System.out.println("poll方法獲?。?+delayQueue.poll()); //立即返回,不會(huì)刪除元素,如果沒(méi)有過(guò)期元素也會(huì)返回該元素,只有當(dāng)隊(duì)列為null時(shí)才會(huì)返回null System.out.println("peek方法獲取:"+delayQueue.peek()); //進(jìn)行阻塞 System.out.println("take方法獲?。?+delayQueue.take().getData()); //立即返回,但不能保證順序 Iterator<DelayElement> iterator = delayQueue.iterator(); while (iterator.hasNext()){ DelayElement element = iterator.next(); System.out.println("iterator獲?。?+element.getData()); } } static class DelayElement<E> implements Delayed{ private final long expireTime; private final E e; public DelayElement(E e,long delay) { this.expireTime = System.currentTimeMillis()+delay; this.e = e; } @Override public long getDelay(TimeUnit unit) { //判斷是否過(guò)期 return unit.convert(expireTime-System.currentTimeMillis(),TimeUnit.MILLISECONDS); } @Override public int compareTo(Delayed delayed) { //排序規(guī)則:按照過(guò)期時(shí)間排序 DelayElement that = (DelayElement)delayed; if (this.expireTime<that.expireTime){ return -1; }else if (this.expireTime>that.expireTime){ return 1; }else { return 0; } } public E getData() { return e; } } }
運(yùn)行結(jié)果:
隊(duì)列大小:4
poll方法獲?。簄ull
peek方法獲?。篶om.brycen.part3.threadpool.collections.ArrayBlockingQueueExample$DelayElement@2437c6dc
take方法獲取:test2
iterator獲?。簍est1
iterator獲取:test4
iterator獲?。簍est3
到此這篇關(guān)于Java線程池隊(duì)列DelayQueue的使用詳解的文章就介紹到這了,更多相關(guān)Java線程池隊(duì)列DelayQueue內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java并發(fā)編程之詳解CyclicBarrier線程同步
在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口,ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue,BlockingDeque接口,ConcurrentHashMap,CountDownLatch,本文為系列文章第十篇,需要的朋友可以參考下2021-06-06HTTPClient如何在Springboot中封裝工具類(lèi)
這篇文章主要介紹了HTTPClient如何在Springboot中封裝工具類(lèi)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09基于mybatis中數(shù)組傳遞注意事項(xiàng)
這篇文章主要介紹了mybatis中數(shù)組傳遞注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09java中將一個(gè)List等分成n個(gè)list的工具方法(推薦)
下面小編就為大家?guī)?lái)一篇java中將一個(gè)List等分成n個(gè)list的工具方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03java調(diào)用微信接口實(shí)現(xiàn)網(wǎng)頁(yè)分享小功能
這篇文章主要為大家詳細(xì)介紹了java調(diào)用微信接口實(shí)現(xiàn)網(wǎng)頁(yè)分享小功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04