Java利用DelayQueue實現(xiàn)延遲任務(wù)代碼實例
DelayQueue實現(xiàn)延遲任務(wù)
JDK自帶DelayQueue 是一個支持延時獲取元素的阻塞隊列, 內(nèi)部采用優(yōu)先隊列 PriorityQueue 存儲元素,同時元素必須實現(xiàn) Delayed 接口;
在創(chuàng)建元素時可以指定多久才可以從隊列中獲取當前元素,只有在延遲期滿時才能從隊列中提取元素。

DelayQueue屬于排序隊列,它的特殊之處在于隊列的元素必須實現(xiàn)Delayed接口,該接口需要實現(xiàn)compareTo和getDelay方法。
getDelay方法:獲取元素在隊列中的剩余時間,只有當剩余時間為0時元素才可以出隊列。
compareTo方法:用于排序,確定元素出隊列的順序。
實現(xiàn)方法:
1:在測試包jdk下創(chuàng)建延遲任務(wù)元素對象DelayedTask,實現(xiàn)compareTo和getDelay方法;
2:在main方法中創(chuàng)建DelayQueue并向延遲隊列中添加三個延遲任務(wù);
3:循環(huán)的從延遲隊列中拉取任務(wù)。
package com.dack.test;
import java.util.Calendar;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class DelayedTask implements Delayed {
public static DelayQueue<DelayedTask> queue;
// 任務(wù)的執(zhí)行時間
private int executeTime = 0;
// 業(yè)務(wù)需要的參數(shù)
private String outStr = "";
public static void main(String[] args) {
DelayedTask.queue = new DelayQueue<DelayedTask>();
// 可有可無
DelayedTask.queue.add(new DelayedTask(2, "hello"));
System.out.println(System.currentTimeMillis() + "服務(wù)啟動");
while (true) {
DelayedTask delayedTask = DelayedTask.queue.poll();
if (delayedTask != null) {
String os = delayedTask.getOutStr();
//可以隨時添加新的延時任務(wù)
DelayedTask.queue.add(new DelayedTask(2, "hello"));
System.out.println(System.currentTimeMillis() + " 消費服務(wù) ,傳參" + os);
}
}
}
public DelayedTask(int delay) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, delay);
this.executeTime = (int) (calendar.getTimeInMillis());
}
// 業(yè)務(wù)所需的參數(shù)構(gòu)造方法
public DelayedTask(int delay, String str) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, delay);
this.executeTime = (int) (calendar.getTimeInMillis());
this.outStr = str;
}
/**
* 元素在隊列中的剩余時間
*
* @param unit
* @return
*/
@Override
public long getDelay(TimeUnit unit) {
Calendar calendar = Calendar.getInstance();
return executeTime - (calendar.getTimeInMillis());
}
/**
* 元素排序
*
* @param o
* @return
*/
@Override
public int compareTo(Delayed o) {
long val = this.getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);
return val == 0 ? 0 : (val < 0 ? -1 : 1);
}
public int getExecuteTime() {
return executeTime;
}
public void setExecuteTime(int executeTime) {
this.executeTime = executeTime;
}
public String getOutStr() {
return outStr;
}
public void setOutStr(String outStr) {
this.outStr = outStr;
}
}到此這篇關(guān)于Java利用DelayQueue實現(xiàn)延遲任務(wù)代碼實例的文章就介紹到這了,更多相關(guān)Java的DelayQueue實現(xiàn)延遲任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java+Selenium實現(xiàn)控制瀏覽器的啟動選項Options
這篇文章主要為大家詳細介紹了如何使用java代碼利用selenium控制瀏覽器的啟動選項Options的代碼操作,文中的示例代碼講解詳細,感興趣的可以了解一下2023-01-01
SpringBoot中yml的數(shù)據(jù)綁定示例
本文主要介紹了SpringBoot中yml的數(shù)據(jù)綁定示例,借助于YAML的簡潔語法和結(jié)構(gòu)化特性,我們能夠輕松地管理應(yīng)用程序的配置信息,使得配置文件更加清晰易讀,感興趣的可以了解一下2023-11-11
SpringBoot詳細講解異步任務(wù)如何獲取HttpServletRequest
在使用框架日常開發(fā)中需要在controller中進行一些異步操作減少請求時間,但是發(fā)現(xiàn)在使用@Anysc注解后會出現(xiàn)Request對象無法獲取的情況,本文就此情況給出完整的解決方案2022-04-04

