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

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ù)量的增加而擴容,阻塞隊列指的是當隊列內(nèi)元素數(shù)量為0的時候,試圖從隊列內(nèi)獲取元素的線程將被阻塞或者拋出異常)

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

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

延遲隊列不接收null元素

二、DelayQueue的作用

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

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

三、DelayQueue的實現(xiàn)

定義延遲隊列元素

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

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

    // 獲取任務剩余時間
    @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ā)起訂單下單的時候將訂單演示對象放入orderDelayQueue
orderDelayQueue.add(
        new OrderDelayTask(
                "123456", // 訂單id
                30 * 60 * 1000, // 延遲時間:30分鐘
        )
);

開啟線程處理延遲任務

@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();
                    // 當隊列為null的時候,poll()方法會直接返回null, 不會拋出異常,但是take()方法會一直等待,因此會拋出一個InterruptedException類型的異常。(當阻塞方法收到中斷請求的時候就會拋出InterruptedException異常)
                    Long orderId = task.getOrderId();
                    // 執(zhí)行業(yè)務
                }
            } catch (InterruptedException e) { 
                // 因為是重寫Runnable接口的run方法,子類拋出的異常要小于等于父類的異常。而在Runnable中run方法是沒有拋異常的。所以此時是不能拋出InterruptedException異常。如果此時你只是記錄日志的話,那么就是一個不負責任的做法,因為在捕獲InterruptedException異常的時候自動的將是否請求中斷標志置為了false。在捕獲了InterruptedException異常之后,如果你什么也不想做,那么就將標志重新置為true,以便棧中更高層的代碼能知道中斷,并且對中斷作出響應。
            	Thread.currentThread().interrupt();
            }
        }).start();
    }
}

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

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

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

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

相關文章

  • 基于java實現(xiàn)的ECC加密算法示例

    基于java實現(xiàn)的ECC加密算法示例

    這篇文章主要介紹了基于java實現(xiàn)的ECC加密算法,簡單說明了ECC算法的概念、原理,并結合實例形式分析了java實現(xiàn)ECC加密算法的定義與使用技巧,需要的朋友可以參考下
    2017-08-08
  • Spring中如何獲取request的方法匯總及其線程安全性分析

    Spring中如何獲取request的方法匯總及其線程安全性分析

    這篇文章主要給大家介紹了關于Spring中如何獲取request的方法匯總及其線程安全性分析的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-04-04
  • Java?中向?Arraylist?添加對象的示例代碼

    Java?中向?Arraylist?添加對象的示例代碼

    本文介紹了如何在 Java 中向 ArrayList 添加對象,并提供了示例和注意事項,通過掌握這些知識,讀者可以在自己的 Java 項目中有效地使用 ArrayList 來存儲和操作對象,需要的朋友可以參考下
    2023-11-11
  • 手把手教你SpringBoot整合Mybatis

    手把手教你SpringBoot整合Mybatis

    這篇文章主要介紹了手把手教你SpringBoot整合Mybatis,Mybatis是一款持久化框架,可以幫我們省去大部分jdbc的代碼,需要的朋友可以參考下
    2023-03-03
  • Java的位圖和布隆過濾器深入詳細講解

    Java的位圖和布隆過濾器深入詳細講解

    這篇文章主要介紹了Java的位圖和布隆過濾器,在學習之前的數(shù)據(jù)結構的時候,我們使用的數(shù)據(jù)量都不是很大,但是在生活中,我們常常面臨著要處理大量數(shù)據(jù)結果并得出最終結果,那么有沒有什么數(shù)據(jù)結構可以幫助我們實現(xiàn)這樣的功能呢,想要繼續(xù)了解的朋友可以參考下
    2024-10-10
  • 深入淺出講解Spring框架中依賴注入與控制反轉及應用

    深入淺出講解Spring框架中依賴注入與控制反轉及應用

    依賴注入(Dependency?Injection)和控制反轉(Inversion?of?Control)是同一個概念。具體含義是:當某個角色(可能是一個Java實例,調(diào)用者)需要另一個角色(另一個Java實例,被調(diào)用者)的協(xié)助時,在?傳統(tǒng)的程序設計過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例
    2022-03-03
  • Go Java算法之字符串中第一個唯一字符詳解

    Go Java算法之字符串中第一個唯一字符詳解

    這篇文章主要為大家介紹了Go Java算法之字符串中第一個唯一字符詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 使用Apache?POI和SpringBoot實現(xiàn)Excel文件上傳和解析功能

    使用Apache?POI和SpringBoot實現(xiàn)Excel文件上傳和解析功能

    在現(xiàn)代企業(yè)應用開發(fā)中,數(shù)據(jù)的導入和導出是一項常見且重要的功能需求,Excel?作為一種廣泛使用的電子表格工具,常常被用來存儲和展示數(shù)據(jù),下面我們來看看如何使用Apache?POI和SpringBoot實現(xiàn)Excel文件上傳和解析功能吧
    2025-01-01
  • 在es中查詢null值的操作方法

    在es中查詢null值的操作方法

    在我們向es中寫入數(shù)據(jù)時,有些時候數(shù)據(jù)寫入到es中的是null,或者沒有寫入這個字段,那么這個時候在es中該如何查詢出這種為null的數(shù)據(jù)呢,本文給大家詳細講解,需要的朋友參考下吧
    2023-02-02
  • Java中Arrays.asList()方法詳解及實例

    Java中Arrays.asList()方法詳解及實例

    這篇文章主要介紹了Java中Arrays.asList()方法將數(shù)組作為列表時的一些差異的相關資料,需要的朋友可以參考下
    2017-06-06

最新評論