Java的DelayQueue延遲隊列簡單使用代碼實例
DelayQueue延遲隊列代碼實例
DelayQueue是一個延遲隊列,插入隊列的數據只有達到設置的延遲時間時才能被取出,否則線程會被阻塞。
插入隊列的對象必須實現Delayed接口,實現comapreTo方法和getDelay方法,其中getDelay方法用于設置對象延遲多少秒取出,compareTo用于對被延遲取出的數據進行排序
所以compareTo方法中一般調用對象的getDelay方法,根據對象的延遲時間進行排序。
首先是定義實現Delayed接口的類:
import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; /** * 實現Delayed接口,用于插入延遲阻塞隊列 * @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; } //排序方法,用于將插入隊列的對象按延遲時間進行排序 @Override public int compareTo(Delayed delayed) { Worker worker=(Worker) delayed; return (this.getDelay(TIME_UNIT)-worker.getDelay(TIME_UNIT))>0?1:0; } //延遲時間,用于確定取出隊列中數據的時間 @Override public long getDelay(TimeUnit unit) { return endTime-System.currentTimeMillis(); } }
然后是測試向DelayQueue插入數據和取出數據:
import java.sql.Date; import java.text.SimpleDateFormat; import java.util.concurrent.DelayQueue; /** * 向延遲隊列中插入數據,并在到達延遲時間時從隊列中取出數據,否則就阻塞當前線程 * @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"); //向延遲隊列中插入數據,并設置延遲取出的時間 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 { //啟動線程后,從延遲隊列中取出數據,如果沒有滿足延遲時間條件的數據可以取出就阻塞住線程 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(); //向延遲隊列中插入數據 company.startWork("zhangsan", "1001", 1); company.startWork("lisi", "1002", 3); company.startWork("wanger", "1003", 5); } }
到此這篇關于Java的DelayQueue延遲隊列簡單使用代碼實例的文章就介紹到這了,更多相關DelayQueue延遲隊列代碼實例內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java格式化輸出詳細講解(printf、print、println、format等)
Java的格式化輸出等同于String.Format,與C有很大的相似,下面這篇文章主要給大家介紹了關于Java格式化輸出(printf、print、println、format等)的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-03-03IDEA的默認快捷鍵設置與Eclipse的常用快捷鍵的設置方法
這篇文章主要介紹了IDEA的默認快捷鍵設置與Eclipse的常用快捷鍵的設置方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01