<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在阻塞隊裡中,除了對元素進行增加和刪除外,我們可以把元素的刪除做一個延遲的處理,即使用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"); }
類似於PriorityBlockingQueue,是二元堆積實現的無界優先順序阻塞佇列。要求元素都實現Delayed 介面,通過執行時延從佇列中提取任務,只有在延遲期滿後才能從中提取元素。DelayQueue的泛型引數需要實現Delayed介面,Delayed介面繼承了Comparable介面,DelayQueue內部使用非執行緒安全的優先佇列(PriorityQueue),並使用Leader/Followers模式,最小化不必要的等待時間。DelayQueue不允許包含null元素。
public interface Delayed extends Comparable<Delayed> { /** * 返回與此物件關聯的剩餘延遲(給定的時間單位)。 * @param unit 時間單位 * @返回剩餘延遲;零值或負值表示 延遲已過期 */ long getDelay(TimeUnit unit); }
快取系統的設計:可以用DelayQueue儲存快取元素的有效期,使用一個執行緒迴圈查詢DelayQueue,一旦能從DelayQueue中獲取元素時,表示快取有效期到了。
定時任務排程:使用DelayQueue儲存當天將會執行的任務和執行時間,一旦從DelayQueue中獲取到任務就開始執行,從比如TimerQueue就是使用DelayQueue實現的。
//可重入同步鎖 private final transient ReentrantLock lock = new ReentrantLock(); //DelayQueue的實現依賴於PriorityQueue(優先佇列) private final PriorityQueue<E> q = new PriorityQueue<E>(); //第一個等待某個延時物件的執行緒,在延時物件還沒有到期時其他執行緒看到這個leader不為null,那麼就直接wait //主要是為了避免大量執行緒在同一時間點喚醒,導致大量的競爭,反而影響效能 private Thread leader = null; //條件佇列,用於wait執行緒 private final Condition available = lock.newCondition();
//從上面屬性就可以看出,DelayQueue採用了餓漢模式,呼叫構造方法即建立了佇列範例 public DelayQueue() {} /** * 建立一個DelayQueue,最初包含給定的Collection範例集合。 * @param c 最初包含的元素集合 */ public DelayQueue(Collection<? extends E> c) { this.addAll(c); }
class MyDelay<T> implements Delayed { long delayTime; // 延遲時間 long expire; // 過期時間 T data; public MyDelay(long delayTime, T t) { this.delayTime = delayTime; // 過期時間 = 當前時間 + 延遲時間 this.expire = System.currentTimeMillis() + delayTime; data = t; } /** * 剩餘時間 = 到期時間 - 當前時間 */ @Override public long getDelay(TimeUnit unit) { return unit.convert(this.expire - System.currentTimeMillis(), TimeUnit.MILLISECONDS); } /** * 優先順序規則:兩個任務比較,時間短的優先執行 */ @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, "第一次新增任務")); queue.add(new MyDelay(3, "第二次新增任務")); queue.add(new MyDelay(5, "第三次新增任務")); while (!queue.isEmpty()) { Delayed delayed = queue.take(); System.out.println(delayed); } } }
DelayQueue其實採用了裝飾器模式,在對PriorityQueue進行包裝下增加了延時時間獲取元素的功能,其主要特點歸納如下:
到此這篇關於詳解Java執行緒池佇列中的延遲佇列DelayQueue的文章就介紹到這了,更多相關Java延遲佇列DelayQueue內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45