阻塞佇列BlockingQueue(三)--DelayQueue
DelayQueue
支援延時獲取元素的無界阻塞佇列
內部採用PriorityQueue與ReentrantLock實現。
public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
implements BlockingQueue<E> {
private transient final ReentrantLock lock = new ReentrantLock();
private transient final Condition available = lock.newCondition();
private final PriorityQueue<E> q = new PriorityQueue<E>();
...
}
佇列中元素必須實現Delayed介面,Delayed介面又繼承了Comparable介面,原因在於DelayQueue內部元素需要排序
,一般情況按過期時間優先順序排序。
public interface Delayed extends Comparable<Delayed> {
long getDelay(TimeUnit unit);
}
應用場景
- 快取系統的設計:可以用DelayQueue儲存快取元素的有效期,使用一個執行緒迴圈查詢DelayQueue,一旦能從DelayQueue中獲取元素時,表示快取有效期到了。
- 定時任務排程:使用DelayQueue儲存當天將會執行的任務和執行時間,一旦從DelayQueue中獲取到任務就開始執行,比如TimerQueue就是使用DelayQueue實現的。
實現Delayed介面
第一步:在物件建立的時候,初始化基本資料。使用time記錄當前物件延遲到什麼時候可以使用,使用sequenceNumber來標識元素在佇列中的先後順序。
private static final AtomicLong sequencer = new AtomicLong(0);
ScheduledFutureTask(Runnable r, V result, long ns, long period) {
super(r, result);
this.time = ns;
this.period = period;
this.sequenceNumber = sequencer.getAndIncrement();
}
第二步:實現(Delayed 介面的)getDelay方法返回當前元素還需要延時多長時間,單位是納秒。
public long getDelay(TimeUnit unit) {
return unit.convert(time - now(), TimeUnit.NANOSECONDS);
}
第三步:如何實現compareTo方法來指定元素的順序。例如,讓延時時間最長的放在佇列的末尾。
如何實現延時阻塞佇列
當消費者從佇列裡獲取元素時,如果元素沒有達到延時時間,就阻塞當前執行緒。
leader變數是一個等待獲取佇列頭部元素的執行緒。
- 如果leader!=null,表示已經有執行緒在等待獲取佇列的頭元素。所以,使用await()方法讓當前執行緒等待訊號。
- 如果leader==null,則把當前執行緒設定成leader,並使用awaitNanos()方法讓當前執行緒等待接收訊號或等待delay時間。
相關文章
- 阻塞佇列 BlockingQueue佇列BloC
- 延遲阻塞佇列 DelayQueue佇列
- 阻塞佇列 DelayQueue 原始碼解析佇列原始碼
- Java併發系列 — 阻塞佇列(BlockingQueue)Java佇列BloC
- Java執行緒(篇外篇):阻塞佇列BlockingQueueJava執行緒佇列BloC
- 阻塞佇列 BlockingQueue(二)--ArrayBlockingQueue與LinkedBlockingQueue佇列BloC
- Java 阻塞佇列(BlockingQueue)的內部實現原理Java佇列BloC
- Java BlockingQueue 阻塞佇列[用於多執行緒]JavaBloC佇列執行緒
- Java併發指南11:解讀 Java 阻塞佇列 BlockingQueueJava佇列BloC
- 佇列、阻塞佇列佇列
- 阻塞佇列一——java中的阻塞佇列佇列Java
- 阻塞佇列佇列
- BlockingQueue的作用以及實現的幾個常用阻塞佇列原理BloC佇列
- Java中常用的七個阻塞佇列第二篇DelayQueue原始碼介紹Java佇列原始碼
- Java併發包原始碼學習系列:阻塞佇列實現之DelayQueue原始碼解析Java原始碼佇列
- 死磕阻塞佇列佇列
- java併發程式設計工具類JUC第一篇:BlockingQueue阻塞佇列Java程式設計BloC佇列
- Java併發包原始碼學習系列:阻塞佇列BlockingQueue及實現原理分析Java原始碼佇列BloC
- 解讀 Java 併發佇列 BlockingQueueJava佇列BloC
- 阻塞佇列--LinkedBlockingQueue佇列BloC
- Java中的阻塞佇列Java佇列
- 阻塞佇列——四組API佇列API
- 乾貨|解讀Java併發佇列BlockingQueueJava佇列BloC
- 處理線上RabbitMQ佇列阻塞MQ佇列
- 聊聊併發(四)——阻塞佇列佇列
- 阻塞佇列 SynchronousQueue 原始碼解析佇列原始碼
- java併發程式設計工具類JUC第三篇:DelayQueue延時佇列Java程式設計佇列
- [Java併發程式設計實戰] 阻塞佇列 BlockingQueue(含程式碼,生產者-消費者模型)Java程式設計佇列BloC模型
- Java併發——阻塞佇列集(下)Java佇列
- Java併發——阻塞佇列集(上)Java佇列
- 阻塞佇列 LinkedTransferQueue 原始碼解析佇列原始碼
- 阻塞佇列 PriorityBlockingQueue 原始碼解析佇列BloC原始碼
- 什麼是阻塞佇列?如何使用阻塞佇列來實現生產者-消費者模型?佇列模型
- 併發佇列ConcurrentLinkedQueue和阻塞佇列LinkedBlockingQueue用法佇列BloC
- JAVA併發之阻塞佇列淺析Java佇列
- Java併發程式設計:阻塞佇列Java程式設計佇列
- Java併發程式設計——阻塞佇列Java程式設計佇列
- JAVA中常見的阻塞佇列詳解Java佇列