Java的DelayQueue延遲隊(duì)列簡單使用代碼實(shí)例
DelayQueue延遲隊(duì)列代碼實(shí)例
DelayQueue是一個延遲隊(duì)列,插入隊(duì)列的數(shù)據(jù)只有達(dá)到設(shè)置的延遲時間時才能被取出,否則線程會被阻塞。
插入隊(duì)列的對象必須實(shí)現(xiàn)Delayed接口,實(shí)現(xiàn)comapreTo方法和getDelay方法,其中g(shù)etDelay方法用于設(shè)置對象延遲多少秒取出,compareTo用于對被延遲取出的數(shù)據(jù)進(jìn)行排序
所以compareTo方法中一般調(diào)用對象的getDelay方法,根據(jù)對象的延遲時間進(jìn)行排序。
首先是定義實(shí)現(xiàn)Delayed接口的類:
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
/**
* 實(shí)現(xiàn)Delayed接口,用于插入延遲阻塞隊(duì)列
* @author SN
*
*/
public class Worker implements Delayed{
private String name;
private String workNo;
private long startTime;
private long endTime;
public static final TimeUnit TIME_UNIT=TimeUnit.SECONDS;
public Worker(String name,String workNo,long startTime,long endTime){
this.name=name;
this.workNo=workNo;
this.startTime=startTime;
this.endTime=endTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWorkNo() {
return workNo;
}
public void setWorkNo(String workNo) {
this.workNo = workNo;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public long getEndTime() {
return endTime;
}
public void setEndTime(long endTime) {
this.endTime = endTime;
}
//排序方法,用于將插入隊(duì)列的對象按延遲時間進(jìn)行排序
@Override
public int compareTo(Delayed delayed) {
Worker worker=(Worker) delayed;
return (this.getDelay(TIME_UNIT)-worker.getDelay(TIME_UNIT))>0?1:0;
}
//延遲時間,用于確定取出隊(duì)列中數(shù)據(jù)的時間
@Override
public long getDelay(TimeUnit unit) {
return endTime-System.currentTimeMillis();
}
}然后是測試向DelayQueue插入數(shù)據(jù)和取出數(shù)據(jù):
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.concurrent.DelayQueue;
/**
* 向延遲隊(duì)列中插入數(shù)據(jù),并在到達(dá)延遲時間時從隊(duì)列中取出數(shù)據(jù),否則就阻塞當(dāng)前線程
* @author SN
*
*/
public class DelayQueueExp implements Runnable{
private DelayQueue<Worker> queue=new DelayQueue<>();
public boolean working=true;
public static final SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//向延遲隊(duì)列中插入數(shù)據(jù),并設(shè)置延遲取出的時間
public void startWork(String name,String workNo,int grade){
long time=System.currentTimeMillis();
Date date=new Date(time);
Worker worker=new Worker(name, workNo, System.currentTimeMillis(), grade*10000+time);
System.out.println("員工"+worker.getName()+",工號"+worker.getWorkNo()+"于"+sdf.format(date)+"打卡上班...");
this.queue.add(worker);
}
public void endWork(Worker worker){
Date date=new Date(worker.getEndTime());
System.out.println("員工"+worker.getName()+",工號"+worker.getWorkNo()+"于"+sdf.format(date)+"打卡下班...");
}
@Override
public void run() {
while (working) {
try {
//啟動線程后,從延遲隊(duì)列中取出數(shù)據(jù),如果沒有滿足延遲時間條件的數(shù)據(jù)可以取出就阻塞住線程
Worker worker=queue.take();
endWork(worker);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
System.out.println("員工開始打卡上班...");
DelayQueueExp company=new DelayQueueExp();
Thread work=new Thread(company);
work.start();
//向延遲隊(duì)列中插入數(shù)據(jù)
company.startWork("zhangsan", "1001", 1);
company.startWork("lisi", "1002", 3);
company.startWork("wanger", "1003", 5);
}
}
到此這篇關(guān)于Java的DelayQueue延遲隊(duì)列簡單使用代碼實(shí)例的文章就介紹到這了,更多相關(guān)DelayQueue延遲隊(duì)列代碼實(shí)例內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot結(jié)合maven配置不同環(huán)境的profile方式
這篇文章主要介紹了springboot結(jié)合maven配置不同環(huán)境的profile方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
SpringCloud Config統(tǒng)一配置中心問題分析解決與客戶端動態(tài)刷新實(shí)現(xiàn)
springcloud config是一個解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個部分,server端提供配置文件的存儲、以接口的形式將配置文件的內(nèi)容提供出去,client端通過接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用2022-10-10
Java中使用LocalDate根據(jù)日期來計(jì)算年齡的實(shí)現(xiàn)方法
這篇文章主要介紹了Java中使用LocalDate根據(jù)日期來計(jì)算年齡的實(shí)現(xiàn)方法,需要的朋友可以參考下2018-01-01
eclipse 如何創(chuàng)建 user library 方法詳解
這篇文章主要介紹了eclipse 如何創(chuàng)建 user library 方法詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
Spring @RequestMapping 注解及使用技巧詳解
@RequestMapping是Spring MVC 中定義請求映射規(guī)則的核心注解,用于將HTTP請求映射到Controller處理方法,下面給大家介紹Spring @RequestMapping 注解及使用技巧,感興趣的朋友一起看看吧2025-06-06
使用@RequiredArgsConstructor注解來取代繁瑣的@Autowrired
有了@RequiredArgsConstructor注解,我們就可以減少@Autowired的書寫,本文主要介紹了使用@RequiredArgsConstructor注解來取代繁瑣的@Autowrired,感興趣的可以了解一下2022-04-04
Java使用try-with-resources實(shí)現(xiàn)自動解鎖
項(xiàng)目中使用Redission分布式鎖,每次使用都需要顯示的解鎖,很麻煩,Java 提供了 try-with-resources 語法糖,它不僅可以用于自動關(guān)閉流資源,還可以用于實(shí)現(xiàn)自動解鎖,本文將介紹如何利用 try-with-resources 實(shí)現(xiàn)鎖的自動釋放,需要的朋友可以參考下2025-01-01
Java在PowerPoint中添加上標(biāo)和下標(biāo)的實(shí)現(xiàn)方法
當(dāng)我們在演示文稿中添加商標(biāo)、版權(quán)或其他符號時,我們可能希望該符號出現(xiàn)在某個文本的上方或下方。在Microsoft PowerPoint中,我們可以通過對符號應(yīng)用上標(biāo)或下標(biāo)格式來實(shí)現(xiàn)這種效果,這篇文章主要介紹了Java在PowerPoint中添加上標(biāo)和下標(biāo),需要的朋友可以參考下2022-10-10

