java中DelayQueue實(shí)例用法詳解
在阻塞隊(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)文章
Springboot項(xiàng)目打包如何將依賴(lài)的jar包輸出到指定目錄
公司要對(duì)springboot項(xiàng)目依賴(lài)的jar包進(jìn)行升級(jí),但是遇到一個(gè)問(wèn)題,項(xiàng)目打包之后,沒(méi)辦法看到他里面依賴(lài)的jar包,版本到底是不是升上去了,沒(méi)辦法看到,下面通過(guò)本文給大家分享Springboot項(xiàng)目打包如何將依賴(lài)的jar包輸出到指定目錄,感興趣的朋友一起看看吧2024-05-05Nacos配合SpringBoot實(shí)現(xiàn)動(dòng)態(tài)線(xiàn)程池的基本步驟
使用Nacos配合Spring Boot實(shí)現(xiàn)動(dòng)態(tài)線(xiàn)程池,可以讓你的應(yīng)用動(dòng)態(tài)地調(diào)整線(xiàn)程池參數(shù)而無(wú)需重啟,這對(duì)于需要高度可配置且需要適應(yīng)不同負(fù)載情況的應(yīng)用來(lái)說(shuō)非常有用,本文給大家介紹實(shí)現(xiàn)動(dòng)態(tài)線(xiàn)程池的基本步驟,需要的朋友可以參考下2024-02-02java實(shí)現(xiàn)Object和Map之間的轉(zhuǎn)換3種方式
本篇文章主要介紹了java實(shí)現(xiàn)Object和Map之間的轉(zhuǎn)換3種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Mybatis plus中使用in查詢(xún)出錯(cuò)如何解決
這篇文章主要介紹了Mybatis plus中使用in查詢(xún)出錯(cuò)的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08如何創(chuàng)建SpringBoot項(xiàng)目
這篇文章主要介紹了如何創(chuàng)建SpringBoot項(xiàng)目,幫助大家更好的學(xué)習(xí)和使用springboot框架,感興趣的朋友可以了解下2021-01-01Spring的@Value如何從Nacos配置中心獲取值并自動(dòng)刷新
這篇文章主要介紹了Spring的@Value如何從Nacos配置中心獲取值并自動(dòng)刷新,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07解決idea?中?SpringBoot?點(diǎn)擊運(yùn)行沒(méi)反應(yīng)按鈕成灰色的問(wèn)題
在使用 Spring Boot 開(kāi)發(fā)項(xiàng)目時(shí),可能會(huì)遇到一個(gè)問(wèn)題:點(diǎn)擊運(yùn)行按鈕后,控制臺(tái)沒(méi)有任何輸出,項(xiàng)目界面也沒(méi)有顯示,這種情況可能是由多種原因?qū)е碌?,本文將介紹一些常見(jiàn)的解決方法,需要的朋友可以參考下2023-08-08Java修改圖片大小尺寸的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了Java修改圖片大小尺寸的簡(jiǎn)單實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09解決java main函數(shù)中的args數(shù)組傳值問(wèn)題
這篇文章主要介紹了解決java main函數(shù)中的args數(shù)組傳值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02