2010-11-05 95 views
0

我有一個事件隊列要處理。一個線程將事件添加到隊列中。
我已經創建了一個可運行的任務,在run方法中完成處理事件所需的全部任務。
我已經宣佈每個任務都有Executors.newCachedThreadPool();和I execute通過executorservice處理順序事件

 public class EventHandler { 

      private static final ExecutorService handlers = Executors.newCachedThreadPool(); 

      public void handleNextEvent(AnEvent event){ 

        handlers.execute(new Task(evt)); 

      } 


     public class Task implements Runnable{ 

     @Override 
      public void run() { 
      //Event processing 
      } 
     } 

public AnotherClass{  
    public void passEvent(AnEvent evt)//This is called by another thread 
    { 
     EventHandler.handleNextEvent(evt); 

    } 
} 

我的問題是,如果我叫執行人execute,我的代碼將獲得下一個事件,並通過運行在執行下一可運行。 我的目的是僅在前一個任務結束後才從隊列中處理下一個事件。
我怎麼會知道前一個任務已經完成或沒有,所以我知道我可以再次調用handleNextEvent?
由任務更新了一些狀態字段是一個好主意嗎?

感謝

+0

你想要的事件來處理一個又一個? – 2010-11-05 08:38:10

+0

@ckuetbach:是的,按照它們的順序排列。 – Cratylus 2010-11-05 09:12:46

回答

6

Executors.newCachedThreadPool()將根據需要創建新的線程,所以它不是你想要的。你想要的東西像Executors.newSingleThreadExecutor(),它將一次處理一個事件,並排隊其餘的。

參見javadoc

創建一個使用單個工作線程無界隊列操作執行器。 (但是請注意,如果這個單線程在關閉之前由於執行期間的失敗而終止,那麼如果需要執行後續任務,則將取代它。)任務保證按順序執行,並且不會有一個任務處於活動狀態在任何給定的時間。

+0

因此,每次我調用execute時,runnable都會排隊等待由同一個線程處理? – Cratylus 2010-11-05 08:40:49

+1

@ user384706:只有當您的runnable不會拋出異常時。如果是這樣,線程將會死亡,並且將啓動一個新線程。唯一的保證是一次只有一個線程執行你的任務。 – skaffman 2010-11-05 08:49:17

相關問題