1、延遲隊列
延遲隊列,底層依賴了優先級隊列PriorityBlockingQueuehtml
2、延遲隊列案例
(1)延遲隊列的任務ide


public class DelayTask implements Delayed { /** * 要執行的任務 */ private String doTask; /** * 任務要執行的時間 */ private Date date; /** * 還剩多長時間,開始執行任務 * @param unit * @return */ @Override public long getDelay(TimeUnit unit) { return unit.convert(date.getTime()-System.currentTimeMillis(),unit) ; } /** * 當前對象,跟其餘延時任務比,誰更先被觸發 * @param o * @return */ @Override public int compareTo(Delayed o) { if(o instanceof DelayTask){ Date otherDate= ((DelayTask) o).getDate(); long a= date.getTime()-otherDate.getTime(); if(a>0){ return 1; }else if(a<0){ return -1; }else{ return 0; } }else{ throw new RuntimeException("隊列數據異常"); } } public String getDoTask() { return doTask; } public void setDoTask(String doTask) { this.doTask = doTask; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } }
(2)延遲隊列的消費線程this


public class DelayTaskThread extends Thread{ private DelayQueue<DelayTask> delayTasksQueue; public DelayTaskThread(DelayQueue<DelayTask> delayTasksQueue ){ this.delayTasksQueue=delayTasksQueue; } @Override public void run() { System.out.println("===========線程開始運行====="); while (true){ try { DelayTask delayTask=delayTasksQueue.take(); System.out.println(DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss")+"獲取任務成功"); Date date =delayTask.getDate(); String task=delayTask.getDoTask(); System.out.println(DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss")+"=====>要執行的任務內容爲【"+task+"】到期時間爲【"+ DateFormatUtils.format(date,"yyyy-MM-dd HH:mm:ss")+"】"); Arrays.asList("a","b"); } catch (InterruptedException e) { e.printStackTrace(); }catch (Exception e){ e.printStackTrace(); } } } }