最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中DelayQueue實(shí)例用法詳解

 更新時(shí)間:2021年01月11日 16:04:28   作者:小妮淺淺  
在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于java中DelayQueue實(shí)例用法詳解內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。

在阻塞隊(duì)里中,除了對(duì)元素進(jìn)行增加和刪除外,我們可以把元素的刪除做一個(gè)延遲的處理,即使用DelayQueue的方法。這里的刪除需要一定的時(shí)間才能生效,有點(diǎn)類(lèi)似于過(guò)期處理的理念。下面我們就DelayQueue的概念、特點(diǎn)進(jìn)行講解,然后在代碼示例中體會(huì)DelayQueue的使用。

1.概念

是一個(gè)帶有延遲時(shí)間的無(wú)界阻塞隊(duì)列。隊(duì)列中的元素,只有等延時(shí)時(shí)間到了,才能取出來(lái)。此隊(duì)列一般用于過(guò)期數(shù)據(jù)的刪除,或任務(wù)調(diào)度。以下,模擬一下定長(zhǎng)時(shí)間的數(shù)據(jù)刪除。

2.特點(diǎn)

(1)無(wú)邊界設(shè)計(jì)

(2)添加(put)不阻塞,移除阻塞

(3)元素都有一個(gè)過(guò)期時(shí)間

(4)取元素只有過(guò)期的才會(huì)被取出

3.實(shí)例

每個(gè)需要放入DelayQueue隊(duì)列元素需要實(shí)現(xiàn)Delayed接口,下面我們創(chuàng)建DelayObject 類(lèi),其實(shí)例對(duì)象將被放入DelayQueue中。其構(gòu)造函數(shù)包括字符串類(lèi)型數(shù)據(jù)及延遲毫秒變量。

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的應(yīng)用實(shí)例

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: 延時(shí)隊(duì)列測(cè)試
 * @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{
  /* 觸發(fā)時(shí)間*/
  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) {// 改成>=會(huì)造成問(wèn)題
      return -1;
    }else {
      return 1;
    }
  }
 
  @Override
  public String toString() {
    return "Item{" +
        "time=" + time +
        ", name='" + name + '\'' +
        '}';
  }
}

運(yùn)行結(jié)果:每5秒取出一個(gè)

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}

到此這篇關(guān)于java中DelayQueue實(shí)例用法詳解的文章就介紹到這了,更多相關(guān)java中DelayQueue是什么內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

仙居县| 盈江县| 腾冲县| 河北省| 奉化市| 江孜县| 萨嘎县| 四会市| 安丘市| 同江市| 石屏县| 伊川县| 罗甸县| 台江县| 灯塔市| 探索| 昌宁县| 新竹县| 安化县| 长葛市| 商洛市| 太康县| 陆良县| 宜宾市| 苏尼特左旗| 深泽县| 佳木斯市| 西昌市| 盐山县| 曲阜市| 修文县| 文山县| 河源市| 屏南县| 齐河县| 门头沟区| 浦北县| 长宁区| 金寨县| 彭州市| 工布江达县|