中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

DelayQueue怎么在java項目中使用

發布時間:2021-01-12 14:50:55 來源:億速云 閱讀:133 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關DelayQueue怎么在java項目中使用,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

1.概念

DelayQueue是一個帶有延遲時間的無界阻塞隊列。隊列中的元素,只有等延時時間到了,才能取出來。此隊列一般用于過期數據的刪除,或任務調度。以下,模擬一下定長時間的數據刪除。

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}

關于DelayQueue怎么在java項目中使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德令哈市| 获嘉县| 平山县| 会同县| 山西省| 德化县| 上高县| 苏尼特右旗| 周至县| 平昌县| 贡嘎县| 巴林左旗| 白沙| 富宁县| 阳城县| 永昌县| 云林县| 汉源县| 洛川县| 珲春市| 色达县| 巴彦县| 鹤壁市| 旬邑县| 百色市| 澎湖县| 精河县| 临夏市| 巴里| 会同县| 梅河口市| 卓尼县| 壤塘县| 四子王旗| 白水县| 尤溪县| 茶陵县| 光山县| 大厂| 栾川县| 宣威市|