欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java線程池隊列中的延遲隊列DelayQueue

 更新時間:2022年12月04日 15:39:23   作者:刨紅薯的小羊竿爾  
這篇文章主要為大家詳細(xì)介紹了Java線程池隊列中的延遲隊列DelayQueue的相關(guān)資料,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

在阻塞隊里中,除了對元素進(jìn)行增加和刪除外,我們可以把元素的刪除做一個延遲的處理,即使用DelayQueue的方法。本文就來和大家聊聊Java線程池隊列中的DelayQueue—延遲隊列 

public enum QueueTypeEnum {
    ARRAY_BLOCKING_QUEUE(1, "ArrayBlockingQueue"),
    LINKED_BLOCKING_QUEUE(2, "LinkedBlockingQueue"),
    DELAY_QUEUE(3, "DelayQueue"),
    PRIORITY_BLOCKING_QUEUE(4, "PriorityBlockingQueue"),
    SYNCHRONOUS_QUEUE(5, "SynchronousQueue"),
    LINKED_TRANSFER_QUEUE(6, "LinkedTransferQueue"),
    LINKED_BLOCKING_DEQUE(7, "LinkedBlockingDeque"),
    VARIABLE_LINKED_BLOCKING_QUEUE(8, "VariableLinkedBlockingQueue"),
    MEMORY_SAFE_LINKED_BLOCKING_QUEUE(9, "MemorySafeLinkedBlockingQueue");
}

DelayQueue延遲隊列

類似于PriorityBlockingQueue,是二叉堆實(shí)現(xiàn)的無界優(yōu)先級阻塞隊列。要求元素都實(shí)現(xiàn)Delayed 接口,通過執(zhí)行時延從隊列中提取任務(wù),只有在延遲期滿后才能從中提取元素。DelayQueue的泛型參數(shù)需要實(shí)現(xiàn)Delayed接口,Delayed接口繼承了Comparable接口,DelayQueue內(nèi)部使用非線程安全的優(yōu)先隊列(PriorityQueue),并使用Leader/Followers模式,最小化不必要的等待時間。DelayQueue不允許包含null元素。

public interface Delayed extends Comparable<Delayed> {

    /**
     * 返回與此對象關(guān)聯(lián)的剩余延遲(給定的時間單位)。
     * @param unit 時間單位
     * @返回剩余延遲;零值或負(fù)值表示 延遲已過期
     */
    long getDelay(TimeUnit unit);
}

DelayQueue使用場景

緩存系統(tǒng)的設(shè)計:可以用DelayQueue保存緩存元素的有效期,使用一個線程循環(huán)查詢DelayQueue,一旦能從DelayQueue中獲取元素時,表示緩存有效期到了。

定時任務(wù)調(diào)度:使用DelayQueue保存當(dāng)天將會執(zhí)行的任務(wù)和執(zhí)行時間,一旦從DelayQueue中獲取到任務(wù)就開始執(zhí)行,從比如TimerQueue就是使用DelayQueue實(shí)現(xiàn)的。

DelayQueue屬性

//可重入同步鎖
private final transient ReentrantLock lock = new ReentrantLock();

//DelayQueue的實(shí)現(xiàn)依賴于PriorityQueue(優(yōu)先隊列)
private final PriorityQueue<E> q = new PriorityQueue<E>();

//第一個等待某個延時對象的線程,在延時對象還沒有到期時其他線程看到這個leader不為null,那么就直接wait
//主要是為了避免大量線程在同一時間點(diǎn)喚醒,導(dǎo)致大量的競爭,反而影響性能
private Thread leader = null;

//條件隊列,用于wait線程
private final Condition available = lock.newCondition();

DelayQueue構(gòu)造方法

//從上面屬性就可以看出,DelayQueue采用了餓漢模式,調(diào)用構(gòu)造方法即創(chuàng)建了隊列實(shí)例
public DelayQueue() {}

/**
 * 創(chuàng)建一個DelayQueue,最初包含給定的Collection實(shí)例集合。
 * @param c 最初包含的元素集合
 */
public DelayQueue(Collection<? extends E> c) {
    this.addAll(c);
}

實(shí)現(xiàn)Delayed接口使用示例

class MyDelay<T> implements Delayed {

    long delayTime; // 延遲時間
    long expire; // 過期時間
    T data;

    public MyDelay(long delayTime, T t) {
        this.delayTime = delayTime;
        // 過期時間 = 當(dāng)前時間 + 延遲時間
        this.expire = System.currentTimeMillis() + delayTime;
        data = t;
    }

    /**
     * 剩余時間 = 到期時間 - 當(dāng)前時間
     */
    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(this.expire - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }

    /**
     * 優(yōu)先級規(guī)則:兩個任務(wù)比較,時間短的優(yōu)先執(zhí)行
     */
    @Override
    public int compareTo(Delayed o) {
        long f = this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS);
        return (int) f;
    }


    @Override
    public String toString() {
        return "delayTime=" + delayTime +
                ", expire=" + expire +
                ", data=" + data;
    }
}

public class DelayQueueDemo {
    static BlockingQueue<Delayed> queue = new DelayQueue();
    public static void main(String[] args) throws InterruptedException {
        queue.add(new MyDelay(8, "第一次添加任務(wù)"));
        queue.add(new MyDelay(3, "第二次添加任務(wù)"));
        queue.add(new MyDelay(5, "第三次添加任務(wù)"));

        while (!queue.isEmpty()) {
            Delayed delayed = queue.take();
            System.out.println(delayed);
        }
    }
}

DelayQueue總結(jié)

DelayQueue其實(shí)采用了裝飾器模式,在對PriorityQueue進(jìn)行包裝下增加了延時時間獲取元素的功能,其主要特點(diǎn)歸納如下:

  • DelayQueue是一個無界阻塞隊列,隊列內(nèi)部使用PriorityQueue來實(shí)現(xiàn)
  • 進(jìn)入隊列的元素必須實(shí)現(xiàn)Delayed接口,在創(chuàng)建元素時可以指定多久才能從隊列中獲取當(dāng)前元素,只有在延遲期滿時才能從中提取元素
  • 該隊列頭部是延遲期滿后保存時間最長的Delayed元素
  • 如果沒有延遲未過期元素,且隊列沒有頭部,并且poll將返回null
  • 當(dāng)一個元素的getDelay(TimeUnit.NANOSECONDS)方法返回一個小于等于0的值時,表示該元素已過期
  • 無法使用poll或take移除未到期的元素,也不會將這些元素作為正常元素對待;例如:size方法返回到期和未到期元素的計數(shù)之和
  • 此隊列不允許使用null元素

到此這篇關(guān)于詳解Java線程池隊列中的延遲隊列DelayQueue的文章就介紹到這了,更多相關(guān)Java延遲隊列DelayQueue內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于多線程中join()的用法實(shí)例講解

    基于多線程中join()的用法實(shí)例講解

    下面小編就為大家?guī)硪黄诙嗑€程中join()的用法實(shí)例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • SpringBoot中如何統(tǒng)一接口返回與全局異常處理詳解

    SpringBoot中如何統(tǒng)一接口返回與全局異常處理詳解

    全局異常處理是個比較重要的功能,一般在項(xiàng)目里都會用到,這篇文章主要給大家介紹了關(guān)于SpringBoot中如何統(tǒng)一接口返回與全局異常處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • Java繪圖技術(shù)的詳解及實(shí)例

    Java繪圖技術(shù)的詳解及實(shí)例

    這篇文章主要介紹了Java繪圖技術(shù)的詳解及實(shí)例的相關(guān)資料,這里主要詳解Graphics類的使用,需要的朋友可以參考下
    2017-08-08
  • 在mybatis中如何將Map作為參數(shù)

    在mybatis中如何將Map作為參數(shù)

    這篇文章主要介紹了在mybatis中如何將Map作為參數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringBoot實(shí)現(xiàn)快遞物流查詢功能(快遞鳥)

    SpringBoot實(shí)現(xiàn)快遞物流查詢功能(快遞鳥)

    本文將基于springboot2.4.0實(shí)現(xiàn)快遞物流查詢,物流信息的獲取通過快遞鳥第三方實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-10-10
  • java 源碼分析Arrays.asList方法詳解

    java 源碼分析Arrays.asList方法詳解

    這篇文章主要介紹了java 源碼分析Arrays.asList方法詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Spring?Cloud?Alibaba使用Nacos作為注冊中心和配置中心

    Spring?Cloud?Alibaba使用Nacos作為注冊中心和配置中心

    這篇文章主要為大家介紹了Spring?Cloud?Alibaba使用Nacos作為注冊中心和配置中心的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • SpringBoot+kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能詳解

    SpringBoot+kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何結(jié)合kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下
    2024-01-01
  • Java實(shí)現(xiàn)動態(tài)模擬時鐘

    Java實(shí)現(xiàn)動態(tài)模擬時鐘

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)動態(tài)模擬時鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • springboot+maven快速構(gòu)建項(xiàng)目的示例代碼

    springboot+maven快速構(gòu)建項(xiàng)目的示例代碼

    本篇文章主要介紹了springboot+maven快速構(gòu)建項(xiàng)目的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論