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怎么獲取當前時間、計算程序運行時間源碼詳解(超詳細!)
有的時候,我們需要查看某一段代碼的性能如何,最為簡單的方式,可以通過計算該段代碼執(zhí)行的耗時,來進行簡單的判斷,這篇文章主要給大家介紹了關(guān)于Java怎么獲取當前時間、計算程序運行時間的相關(guān)資料,需要的朋友可以參考下2024-07-07JPA中@CreatedDate和@LastModifiedDate的使用方式
這篇文章主要介紹了JPA中@CreatedDate和@LastModifiedDate的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11Java使用quartz實現(xiàn)定時任務(wù)示例詳解
這篇文章主要為大家介紹了Java使用quartz實現(xiàn)定時任務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08springboot加載復(fù)雜的yml文件獲取不到值的解決方案
這篇文章主要介紹了springboot加載復(fù)雜的yml文件獲取不到值的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03