1. 程式人生 > >Java通過DelayQueue的實現多執行緒任務的阻塞佇列

Java通過DelayQueue的實現多執行緒任務的阻塞佇列

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));
     }
}