亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java線程池隊(duì)列DelayQueue的使用詳解

 更新時(shí)間:2023年12月07日 08:47:37   作者:Brycen Liu  
這篇文章主要介紹了Java線程池隊(duì)列DelayQueue的使用詳解,DelayQueue顧名思義,它是個(gè)無(wú)邊界延遲隊(duì)列,它的底層是基于PriorityBlockingQueue實(shí)現(xiàn)的,該隊(duì)列中的元素都是按照過(guò)期時(shí)間順序排序的,隊(duì)列頭部放的是即將過(guò)期的元素,需要的朋友可以參考下

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線程同步

    Java并發(fā)編程之詳解CyclicBarrier線程同步

    在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口,ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue,BlockingDeque接口,ConcurrentHashMap,CountDownLatch,本文為系列文章第十篇,需要的朋友可以參考下
    2021-06-06
  • java 中Map詳解及實(shí)例代碼

    java 中Map詳解及實(shí)例代碼

    這篇文章主要介紹了java 中Map詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • java枚舉類(lèi)型-Enum

    java枚舉類(lèi)型-Enum

    本文詳細(xì)介紹了 Java1.5 引入的新特性枚舉中的關(guān)鍵字enum,運(yùn)用大量的代碼加以解釋,相信可以幫助到正在學(xué)習(xí)該知識(shí)的小伙伴,大家可以參考一下
    2021-08-08
  • HTTPClient如何在Springboot中封裝工具類(lèi)

    HTTPClient如何在Springboot中封裝工具類(lèi)

    這篇文章主要介紹了HTTPClient如何在Springboot中封裝工具類(lèi)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java中的字節(jié)流文件讀取教程(二)

    Java中的字節(jié)流文件讀取教程(二)

    這篇文章主要給大家介紹了關(guān)于Java中字節(jié)流文件讀取的相關(guān)資料,本文屬于之前文章的延長(zhǎng)篇,有需要的朋友可以先看看上一篇文章,相信會(huì)對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • 基于mybatis中數(shù)組傳遞注意事項(xiàng)

    基于mybatis中數(shù)組傳遞注意事項(xiàng)

    這篇文章主要介紹了mybatis中數(shù)組傳遞注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • JAVA中的引用與對(duì)象詳解

    JAVA中的引用與對(duì)象詳解

    本文主要介紹了JAVA中引用與對(duì)象的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • java中將一個(gè)List等分成n個(gè)list的工具方法(推薦)

    java中將一個(gè)List等分成n個(gè)list的工具方法(推薦)

    下面小編就為大家?guī)?lái)一篇java中將一個(gè)List等分成n個(gè)list的工具方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • java調(diào)用微信接口實(shí)現(xiàn)網(wǎng)頁(yè)分享小功能

    java調(diào)用微信接口實(shí)現(xiàn)網(wǎng)頁(yè)分享小功能

    這篇文章主要為大家詳細(xì)介紹了java調(diào)用微信接口實(shí)現(xiàn)網(wǎng)頁(yè)分享小功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • SpringBoot如何使用redis

    SpringBoot如何使用redis

    文章主要介紹了如何在Spring Boot項(xiàng)目中配置Redis并解決亂碼問(wèn)題,同時(shí)提供了使用Redis操作不同類(lèi)型數(shù)據(jù)(如String、List、Hash、Set、ZSet和Bitmap)的代碼示例
    2025-03-03

最新評(píng)論