java中DelayQueue實例用法詳解
在阻塞隊裡中,除瞭對元素進行增加和刪除外,我們可以把元素的刪除做一個延遲的處理,即使用DelayQueue的方法。這裡的刪除需要一定的時間才能生效,有點類似於過期處理的理念。下面我們就DelayQueue的概念、特點進行講解,然後在代碼示例中體會DelayQueue的使用。
1.概念
是一個帶有延遲時間的無界阻塞隊列。隊列中的元素,隻有等延時時間到瞭,才能取出來。此隊列一般用於過期數據的刪除,或任務調度。以下,模擬一下定長時間的數據刪除。
2.特點
(1)無邊界設計
(2)添加(put)不阻塞,移除阻塞
(3)元素都有一個過期時間
(4)取元素隻有過期的才會被取出
3.實例
每個需要放入DelayQueue隊列元素需要實現Delayed接口,下面我們創建DelayObject 類,其實例對象將被放入DelayQueue中。其構造函數包括字符串類型數據及延遲毫秒變量。
public class DelayObject implements Delayed { private String data; private long startTime; public DelayObject(String data, long delayInMilliseconds) { this.data = data; this.startTime = System.currentTimeMillis() + delayInMilliseconds; }
DelayQueue的應用實例
package org.dromara.hmily.demo.springcloud.account.service; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.concurrent.DelayQueue; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; /** * @description: 延時隊列測試 * @author: hh */ public class DelayedQueneTest { public static void main(String[] args) throws InterruptedException { Item item1 = new Item("item1", 5, TimeUnit.SECONDS); Item item2 = new Item("item2",10, TimeUnit.SECONDS); Item item3 = new Item("item3",15, TimeUnit.SECONDS); DelayQueue<Item> queue = new DelayQueue<>(); queue.put(item1); queue.put(item2); queue.put(item3); System.out.println("begin time:" + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); for (int i = 0; i < 3; i++) { Item take = queue.take(); System.out.format("name:{%s}, time:{%s}\n",take.name, LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME)); } } } class Item implements Delayed{ /* 觸發時間*/ private long time; String name; public Item(String name, long time, TimeUnit unit) { this.name = name; this.time = System.currentTimeMillis() + (time > 0? unit.toMillis(time): 0); } @Override public long getDelay(TimeUnit unit) { return time - System.currentTimeMillis(); } @Override public int compareTo(Delayed o) { Item item = (Item) o; long diff = this.time - item.time; if (diff <= 0) {// 改成>=會造成問題 return -1; }else { return 1; } } @Override public String toString() { return "Item{" + "time=" + time + ", name='" + name + '\'' + '}'; } }
運行結果:每5秒取出一個
begin time:2019-05-31T11:58:24.445 name:{item1}, time:{2019-05-31T11:58:29.262} name:{item2}, time:{2019-05-31T11:58:34.262} name:{item3}, time:{2019-05-31T11:58:39.262}
到此這篇關於java中DelayQueue實例用法詳解的文章就介紹到這瞭,更多相關java中DelayQueue是什麼內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- java DelayQueue的原理淺析
- Java使用延時隊列搞定超時訂單處理的場景
- Java 阻塞隊列BlockingQueue詳解
- java並發中DelayQueue延遲隊列原理剖析
- Redis延遲隊列和分佈式延遲隊列的簡答實現