1. 程式人生 > 程式設計 >java中DelayQueue例項用法詳解

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是什麼內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!