最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java的延遲隊列之DelayQueue解讀

 更新時間:2023年12月13日 08:59:15   作者:得過且過的勇者y  
這篇文章主要介紹了Java的延遲隊列之DelayQueue解讀,DelayQueue的底層存儲是一個PriorityQueue,PriorityQueue是一個可排序的Queue,其中的元素必須實現(xiàn)Comparable接口的compareTo方法,需要的朋友可以參考下

一、DelayQueue的定義

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

DelayQueue是一個無界的BlockingQueue,是線程安全的(無界指的是隊列的元素數(shù)量不存在上限,隊列的容量會隨著元素數(shù)量的增加而擴(kuò)容,阻塞隊列指的是當(dāng)隊列內(nèi)元素數(shù)量為0的時候,試圖從隊列內(nèi)獲取元素的線程將被阻塞或者拋出異常)

以上是阻塞隊列的特點,而延遲隊列還擁有自己如下的特點:

DelayQueue中存入的必須是實現(xiàn)了Delayed接口的對象(Delayed定義了一個getDelay的方法,用來判斷排序后的元素是否可以從Queue中取出,并且Delayed接口還繼承了Comparable用于排序),插入Queue中的數(shù)據(jù)根據(jù)compareTo方法進(jìn)行排序(DelayQueue的底層存儲是一個PriorityQueue,PriorityQueue是一個可排序的Queue,其中的元素必須實現(xiàn)Comparable接口的compareTo方法),并通過getDelay方法返回的時間確定元素是否可以出隊,只有小于等于0的元素(即延遲到期的元素)才能夠被取出

延遲隊列不接收null元素

二、DelayQueue的作用

延遲隊列的作用顯然就是用于執(zhí)行延時任務(wù),如:

  1. 淘寶訂單業(yè)務(wù):下單之后如果三十分鐘之內(nèi)沒有付款就自動取消訂單。
  2. 餓了嗎訂餐通知:下單成功后60s之后給用戶發(fā)送短信通知。
  3. 關(guān)閉空閑連接。服務(wù)器中,有很多客戶端的連接,空閑一段時間之后需要關(guān)閉之。
  4. 緩存。緩存中的對象,超過了空閑時間,需要從緩存中移出。
  5. 任務(wù)超時處理。在網(wǎng)絡(luò)協(xié)議滑動窗口請求應(yīng)答式交互時,處理超時未響應(yīng)的請求等。

三、DelayQueue的實現(xiàn)

定義延遲隊列元素

public class OrderDelayTask implements Delayed {
    
    private Long orderId;
    
    private long delayTime;

    public OrderDelayTask(Long orderId, long delayTime) {
        this.orderId = orderId;
        // 延遲時間加當(dāng)前時間
        this.delayTime = System.currentTimeMillis() + delayTime;
    }

    // 獲取任務(wù)剩余時間
    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(delayTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }

    @Override
    public int compareTo(Delayed o) {
        return Long.compare(delayTime, ((OrderDelayTask) o).delayTime);
    }
}

定義延遲隊列并交付容器管理

@Bean("orderDelayQueue")
public DelayQueue<OrderDelayTask> orderDelayQueue(){
    return new DelayQueue<OrderDelayTask>();
}

使用延遲隊列

@Autowired
private DelayQueue<OrderDelayObject> orderDelayQueue;

//發(fā)起訂單下單的時候?qū)⒂唵窝菔緦ο蠓湃雘rderDelayQueue
orderDelayQueue.add(
        new OrderDelayTask(
                "123456", // 訂單id
                30 * 60 * 1000, // 延遲時間:30分鐘
        )
);

開啟線程處理延遲任務(wù)

@Component
public class DelayTaskRunner<OrderDelayTask> implements InitializingBean {
    
    @Autowired
    private DelayQueue<OrderDelayTask> orderDelayQueue;
    
    @Override
    public void afterPropertiesSet() throws Exception {
    	new Thread(() -> {
            try {
                while(true) {
                    OrderDelayTask task = orderDelayQueue.take();
                    // 當(dāng)隊列為null的時候,poll()方法會直接返回null, 不會拋出異常,但是take()方法會一直等待,因此會拋出一個InterruptedException類型的異常。(當(dāng)阻塞方法收到中斷請求的時候就會拋出InterruptedException異常)
                    Long orderId = task.getOrderId();
                    // 執(zhí)行業(yè)務(wù)
                }
            } catch (InterruptedException e) { 
                // 因為是重寫Runnable接口的run方法,子類拋出的異常要小于等于父類的異常。而在Runnable中run方法是沒有拋異常的。所以此時是不能拋出InterruptedException異常。如果此時你只是記錄日志的話,那么就是一個不負(fù)責(zé)任的做法,因為在捕獲InterruptedException異常的時候自動的將是否請求中斷標(biāo)志置為了false。在捕獲了InterruptedException異常之后,如果你什么也不想做,那么就將標(biāo)志重新置為true,以便棧中更高層的代碼能知道中斷,并且對中斷作出響應(yīng)。
            	Thread.currentThread().interrupt();
            }
        }).start();
    }
}

四、DelayQueue實現(xiàn)延時任務(wù)的優(yōu)缺點

使用DelayQueue實現(xiàn)延時任務(wù)非常簡單,而且簡便,全部都是標(biāo)準(zhǔn)的JDK代碼實現(xiàn),不用引入第三方依賴(不依賴redis實現(xiàn)、消息隊列實現(xiàn)等),非常的輕量級。

它的缺點就是所有的操作都是基于應(yīng)用內(nèi)存的,一旦出現(xiàn)應(yīng)用單點故障,可能會造成延時任務(wù)數(shù)據(jù)的丟失。如果訂單并發(fā)量非常大,因為DelayQueue是無界的,訂單量越大,隊列內(nèi)的對象就越多,可能造成OOM的風(fēng)險。所以使用DelayQueue實現(xiàn)延時任務(wù),只適用于任務(wù)量較小的情況。

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

相關(guān)文章

  • MyBatis-Plus工具使用之EntityWrapper解析

    MyBatis-Plus工具使用之EntityWrapper解析

    這篇文章主要介紹了MyBatis-Plus工具使用之EntityWrapper解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 簡單了解java函數(shù)式編碼結(jié)構(gòu)及優(yōu)勢

    簡單了解java函數(shù)式編碼結(jié)構(gòu)及優(yōu)勢

    這篇文章主要介紹了簡單了解java函數(shù)式編碼結(jié)構(gòu)及優(yōu)勢,本文將探討三種下一代 JVM 語言:Groovy、Scala 和 Clojure,比較并對比新的功能和范例,讓 Java 開發(fā)人員對自己近期的未來發(fā)展有大體的認(rèn)識。,需要的朋友可以參考下
    2019-06-06
  • Java中直接初始化HashMap的方法實現(xiàn)

    Java中直接初始化HashMap的方法實現(xiàn)

    在Java編程中,HashMap 是常用的數(shù)據(jù)結(jié)構(gòu),用于存儲鍵值對,有時我們需要在創(chuàng)建 HashMap 的同時就初始化一些固定的、不會改變的值,然而,Java并沒有像某些動態(tài)語言那樣的直接字面量初始化語法,所以本文給大家介紹了Java中直接初始化HashMap的方法,需要的朋友可以參考下
    2025-06-06
  • Java設(shè)計模式七大原則之迪米特法則詳解

    Java設(shè)計模式七大原則之迪米特法則詳解

    迪米特法則要求一個對象應(yīng)該對其他對象有最少的了解,所以迪米特法則又叫做最少知識原則。本文將為大家詳細(xì)介紹Java設(shè)計模式七大原則之一的迪米特法則,需要的可以參考一下
    2022-02-02
  • Nacos注冊中心的部署與用法示例詳解

    Nacos注冊中心的部署與用法示例詳解

    注冊中心是微服務(wù)架構(gòu)中的紐帶,類似于“通訊錄”,它記錄了服務(wù)和服務(wù)地址的映射關(guān)系,本文通過示例代碼給大家介紹Nacos注冊中心的部署與用法,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • Java8方法引用及構(gòu)造方法引用原理實例解析

    Java8方法引用及構(gòu)造方法引用原理實例解析

    這篇文章主要介紹了Java8方法引用及構(gòu)造方法引用原理實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • Spring中Service注入多個實現(xiàn)類的方法詳解

    Spring中Service注入多個實現(xiàn)類的方法詳解

    這篇文章主要介紹了Spring中Service注入多個實現(xiàn)類的方法詳解,Spring是一個開源的Java框架,用于構(gòu)建企業(yè)級應(yīng)用程序,它提供了許多功能,如依賴注入、面向切面編程、數(shù)據(jù)訪問、Web開發(fā)等,需要的朋友可以參考下
    2023-07-07
  • java獲取微信accessToken的方法

    java獲取微信accessToken的方法

    這篇文章主要為大家詳細(xì)介紹了java獲取微信accessToken的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Springboot Session共享實現(xiàn)原理及代碼實例

    Springboot Session共享實現(xiàn)原理及代碼實例

    這篇文章主要介紹了Springboot Session共享實現(xiàn)原理及代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 里氏代換原則_動力節(jié)點Java學(xué)院整理

    里氏代換原則_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了里氏代換原則的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論

台东县| 黎平县| 佛坪县| 页游| 佛教| 梁河县| 涞水县| 玛曲县| 翁牛特旗| 绥阳县| 上高县| 唐山市| 普兰店市| 望江县| 墨江| 西宁市| 鱼台县| 华宁县| 长乐市| 秦安县| 神农架林区| 赤城县| 宣恩县| 苏尼特左旗| 海林市| 凤冈县| 宁陕县| 灌云县| 沙坪坝区| 房产| 资阳市| 巴楚县| 宜春市| 博爱县| 罗城| 米易县| 苍溪县| 饶河县| 邳州市| 绍兴市| 东港市|