Java通過DelayQueue的實現多執行緒任務的阻塞佇列
阿新 • • 發佈:2019-01-29
2)例項程式碼,實現任務元素的延遲佇列:
//定義延遲佇列中的任務元素,可以通過extends實現不同的run方法; class DelayedTask implements Runnable,Delayed{ private final int delta; //差值訊號:用於記錄任務執行緒的延遲時間; private final long trigger; //觸發訊號:任務執行緒在加入佇列,延遲期滿,即將要執行時的系統時間; public DelayedTask(int delayInMilliseconds){ delta = delayInMilliseconds; trigger = System.currentTimeMillis() + (long)delta; } public long getDelay(TimeUnit unit){ //提供TimeUnit的時間單位的轉換; return unit.convert(trigger - System.currentTimeMillis(),MILLISECONDS); } public void run(){ ...... } } //定義佇列處理完所有的任務後,要執行的任務處理執行緒(永遠在佇列的末端,也可以更具需求不實現該類) class static class EndSentinel extends DelayedTask{ private ExecutorService exec; public EndSentinel(int delay,ExecutorService exec){ super(delay); this.exec = exec; } public void run(){ <do something when all DelayedTask are finished> exec.shutdown(); } } //定義使用整個延遲佇列的任務類 class DelayedTaskConsumer implements Runnable{ private DelayQueue<DelayedTask> queue; public DelayTaskConsumer(DelayQueue<DelayedTask> queue){ this.queue = queue; } public void run(){ try{ if(queue.size() == 0) Thread.interrupt(); while(!Thread.interrupted()) queue.take().run(); }catch(InterruptedException ex){ } <do something when delayedTask is run successfully> } } //測試平臺 class Driver{ void main(){ ExecutorService exec = Executors.newCachedThreadPool(); DelayQueue<DelayedTask> queue = new DelayQueue<DelayedTask>(); for(int i=0;i<N;i++) queue.put(new DelayedTask(new Random().nextInt())); exec.execute(new DelayedTaskConsumer(queue)); } }