1. 程式人生 > >DelayQueue的原理和使用淺談

DelayQueue的原理和使用淺談

https://www.cnblogs.com/wxgblogs/p/5464867.html

 在談到DelayQueue的使用和原理的時候,我們首先介紹一下DelayQueue,DelayQueue是一個無界阻塞佇列,只有在延遲期滿時才能從中提取元素。該佇列的頭部是延遲期滿後儲存時間最長的Delayed 元素。

  DelayQueue阻塞佇列在我們系統開發中也常常會用到,例如:快取系統的設計,快取中的物件,超過了空閒時間,需要從快取中移出;任務排程系統,能夠準確的把握任務的執行時間。我們可能需要通過執行緒處理很多時間上要求很嚴格的資料,如果使用普通的執行緒,我們就需要遍歷所有的物件,一個一個的檢 檢視資料是否過期等,首先這樣在執行上的效率不會太高,其次就是這種設計的風格也大大的影響了資料的精度。一個需要12:00點執行的任務可能12:01 才執行,這樣對資料要求很高的系統有更大的弊端。由此我們可以使用DelayQueue。

  為了具有呼叫行為,存放到DelayDeque的元素必須繼承Delayed介面。Delayed介面使物件成為延遲物件,它使存放在DelayQueue類中的物件具有了啟用日期。該介面強制執行下列兩個方法。

  • CompareTo(Delayed o):Delayed介面繼承了Comparable介面,因此有了這個方法。
  • getDelay(TimeUnit unit):這個方法返回到啟用日期的剩餘時間,時間單位由單位引數指定。
複製程式碼
public class DelayEvent implements Delayed {
    private Date startDate;
    public DelayEvent(Date startDate) {
        
super(); this.startDate = startDate; } @Override public int compareTo(Delayed o) { long result = this.getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS); if (result < 0) { return -1; } else if (result > 0) {
return 1; } else { return 0; } } @Override public long getDelay(TimeUnit unit) { Date now = new Date(); long diff = startDate.getTime() - now.getTime(); return unit.convert(diff, TimeUnit.MILLISECONDS); } }
複製程式碼複製程式碼
public class DelayTask implements Runnable {
    private int id;
    private DelayQueue<DelayEvent> queue;
    public DelayTask(int id, DelayQueue<DelayEvent> queue) {
        super();
        this.id = id;
        this.queue = queue;
    }
    @Override
    public void run() {
        Date now = new Date();
        Date delay = new Date();
        delay.setTime(now.getTime() + id * 1000);
        System.out.println("Thread " + id + " " + delay);
        for (int i = 0; i < 100; i++) {
            DelayEvent delayEvent = new DelayEvent(delay);
            queue.add(delayEvent);
        }
    }
}
複製程式碼複製程式碼
public class DelayDequeMain {
    public static void main(String[] args) throws Exception {
        DelayQueue<DelayEvent> queue = new DelayQueue<DelayEvent>();
        Thread threads[] = new Thread[5];
        for (int i = 0; i < threads.length; i++) {
            DelayTask task = new DelayTask(i + 1, queue);
            threads[i] = new Thread(task);
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
        for (int i = 0; i < threads.length; i++) {
            try {
                threads[i].join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        do {
            int counter = 0;
            DelayEvent delayEvent;
            do {
                delayEvent = queue.poll();
                if (delayEvent != null) {
                    counter++;
                }
            } while (delayEvent != null);
            System.out.println("At " + new Date() + " you have read " + counter+ " event");
            TimeUnit.MILLISECONDS.sleep(500);
        } while (queue.size() > 0);
    }
}
複製程式碼
12345678910111213141516Thread 3 Fri May 06 11:00:20 CST 2016Thread 1 Fri May 06 11:00:18 CST 2016Thread 5 Fri May 06 11:00:22 CST 2016Thread 4 Fri May 06 11:00:21 CST 2016Thread 2 Fri May 06 11:00:19 CST 2016At Fri May 06 11:00:17 CST 2016 you have read 0 eventAt Fri May 06 11:00:18 CST 2016 you have read 0 eventAt Fri May 06 11:00:18 CST 2016 you have read 100 eventAt Fri May 06 11:00:19 CST 2016 you have read 0 eventAt Fri May 06 11:00:19 CST 2016 you have read 100 eventAt Fri May 06 11:00:20 CST 

相關推薦

python學習-09(查找、排序數據結構)

使用 指定 矩陣 這樣的 重復 n) init enc nbsp 查找的方法: 排序的方法: 簡單的數據結構: 一、算計基礎 1.1、什麽是算法: 算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法代表著用系統的方法描述解決問題的策略

從瀏覽器渲染原理迴流重繪與效能優化

目錄 前言 瀏覽器的渲染引擎 渲染流程 渲染樹與渲染物件 迴流 全域性佈局和增量佈局 "迴流"還是"重排"?

DelayQueue原理使用

https://www.cnblogs.com/wxgblogs/p/5464867.html 在談到DelayQueue的使用和原理的時候,我們首先介紹一下DelayQueue,DelayQueue是一個無界阻塞佇列,只有在延遲期滿時才能從中提取元素。該佇列的頭部是延遲期滿

BloomFilter【上】基本概念實現原理

pty 是否 的人 它的 構建 網絡爬蟲 ace head filters ? ??在日常生活中。包括在設計計算機軟件時,我們常常要推斷一個元素是否在一個集合中。

電源濾波原理避免干擾方法

濾波電容可以降低電源的交流阻抗,原因就是實際電源總有內阻,傳輸線路也有阻抗,去耦電容可以讓一部分瞬間變化的電流直接在電容上交換。DC/DC電源電路具有功耗低,功率高的優點,吸收式濾波有電容和電容電路構成,可以將噪聲徹底消除。 DC/DC電路噪聲:紋波和噪聲 DC/DC電源電路具有功耗低,功率

安卓apk加固原理實現

轉載本文需註明出處:EAWorld,違者必究。 引言: 在安卓開發中,打包釋出是開發的最後一個環節,apk是整個專案的原始碼和資源的結合體;對於懂點反編譯原理的人可以輕鬆編譯出apk的原始碼資源,並且可以修改資原始碼、重新打包編譯,輕輕鬆鬆變成自己的apk或者修改其中一部分竊取使用者資訊。

instanceof typeof 的實現原理

typeof 實現原理 typeof 一般被用於判斷一個變數的型別,我們可以利用 typeof 來判斷number, string, object, boolean, function, undefined, symbol 這七種型別,這種判斷能幫助

視訊編解碼器的工作原理應用領域

中國安防網小編要為大家講解三個方面的問題,一什麼是視訊編解碼器,二視訊編解碼器的工作原理,三視訊編解碼器的應用領域,且聽小編下面為大家分析。            什麼是視訊編解碼器          視訊編解碼器,是指一個能夠對數字視訊進行壓縮或者解壓縮的程式

.NET中的型別裝箱/拆箱原理

談到裝箱拆箱,DebugLZQ相信給位園子裡的博友一定可以娓娓道來,大概的意思就是值型別和引用型別的相互轉換唄---值型別到引用型別叫裝箱,反之則叫拆箱。這當然沒有問題,可是你只知道這麼多,那麼DebugLZQ建議你花點時間看看樓主這篇文章,繼續前幾篇博文的風格--淺談雜侃

java堆疊記憶體分配原理

在java中我們把java記憶體分為兩種一種是棧記憶體,一種則是堆記憶體 1.在談java堆疊知識之前我們先來看看java虛擬機器的自動垃圾回收機制 引用變數是普通的變數,定義時在棧中分配,引用變數在程式執行到其作用域之外後被釋放。而陣列和物件本身在堆中

Sybase封鎖原理解決方

  一、 調整死鎖檢測間隔   ① 通過配置引數“print deadlock information”的設定,在ASE的日誌中顯示死鎖發生的情形。   ② 如果應用很少發生死鎖現象,則可以使用引數deadlock checking period來指定進行死鎖檢查之前程序的等待時間,這樣可以延遲死鎖檢查而降低

linux中的根檔案系統(rootfs的原理介紹)

linux中有一個讓很多初學者都不是特別清楚的概念,叫做“根檔案系統”。我接觸linux前前後後也好幾年了,但是對這個問題,至今也不是特別的清楚,至少沒法給出一個很全面很到位的解釋。於是,今天我們就來理一理這個話題。 一、先交代一下檔案系統 在開始討論根檔案

Java網絡編程NIO詳解7: Linux 中NIO Selector 的實現原理

fdt 重要 文件描述 block tor create size 註冊 comm Java網絡編程和NIO詳解7:淺談 Linux 中NIO Selector 的實現原理 轉自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首發於

​一個與彼得原理責任管理有關的小故事

# 淺談職場中彼得原理和責任病毒 ### 一)故事 老王雖然今年才3年工作經驗,但一直深受領導賞識,因為在大家眼裡他是一個責任心特別強的人。無論是領導也好,同事也好,只要有任務安排給他,他都會非常欣然的接受,並能夠非常快的完成。 尤其是最近這幾個月來,老王就更加忙碌了。由於公司業務與去年同期相比發生了巨

mmap()ioremap()的用法與區別

12只 設備 gpa 我們 之間 mmap ioremap shared set 一、mmap()mmap()函數是用來將設備內存線性地址映射到用戶地址空間。(1)首先映射基地址,再通過偏移地址尋址;(2)unsigned char *map_cru_base=(unsig

NIO原理剖析與Netty初步----高性能服務器開發(一)

返回 創建 基於 register 訪問 io操作 nbsp info class 除特別註明外,本站所有文章均為原創,轉載請註明地址 在博主不長的工作經歷中,NIO用的並不多,由於使用原生的Java NIO編程的復雜性,大多數時候我們會選擇Netty,m

密碼加SALT原理

是否 get 註冊 我們 隨機 blank ref .com 使用 我們知道,如果直接對密碼進行散列,那麽黑客可以對通過獲得這個密碼散列值,然後通過查散列值字典(例如MD5密碼破解網站),得到某用戶的密碼。   加Salt可以一定程度上解決這一問題。所謂加Salt方法,就是

軟件項目團隊的建設穩定

足夠 一個 歸屬感 做的 解決 效果 至少 人員 凝聚力 如何建設團隊?如何保持現有團隊穩定?這些都是很高深的問題,但解決方案卻很簡單。 因為答案只有兩個字。 吃飯!吃飯!吃飯! 聚餐!聚餐!聚餐! 大城市我不清楚,至少熱幹面這種二三線城市,要保持團隊人員的凝

MVC、MVP、MVVM架構模式的區別聯系

.html csdn 獲取 視圖 viewmodel url title tle htm 淺談MVC、MVP、MVVM架構模式的區別和聯系 學習了:http://www.cnblogs.com/guwei4037/p/5591183.html http://blog.csd

java內存分配回收策略

內存空間 高效率 cde map details 閾值 老年代 total 關於 一、導論   java技術體系中所提到的內存自動化管理歸根結底就是內存的分配與回收兩個問題,之前已經和大家談過java回收的相關知識,今天來和大家聊聊java對象的在內存中的分配。通俗的講,對