2012-08-10 88 views
0

我有一個java.util.BlockingQueue這是POJOs的需要由ExecutorService服務。該隊列必須由單個線程提供服務,但會一次從多個線程推送。Mullti生產者單消費者執行者服務設計

在過去,我已經寫了我的解決方案看起來有點像,但我真的很鄙視它:

executorService.execute(new Runnable() { 

    @Override 
    public void run() { 
     while (true) { 
      try { 
       POJO job = blockingQueue.take(); 
       servicePOJO(job); 
      } catch (InterruptedException e) { 
       break; 
      } 
     } 
    } 
}); 

有沒有寫這更好的辦法,或這是最佳方式正在做?我不喜歡這樣做的原因是因爲如果我需要添加多個消費者,我需要在實際線程池的大小的循環中運行上面的代碼。

+0

你爲什麼不簡單地使用單線程執行程序? – sarcan 2012-08-10 23:50:41

+0

這裏不清楚'ExecutorService'的意義,除了看起來你沒有創建一個專門服務這個隊列的線程。你當然是在竊取一個線程來執行這個操作,並且它不符合'ExecutorService'的預期用法。另外,當你通過調用Thread.currentThread()。interrupt()'傳播中斷時,你在這裏吞下'InterruptedException'。 – seh 2012-08-11 00:26:09

回答

0

我會使用ExecutorService每個對象的任務。

public <POJO> void asyncServicePOJO(final POJO pojo) { 
    executorService.execute(new Runnable() { 
     @Override 
     public void run() { 
      servicePOJO(pojo); 
     } 
    }); 
} 

不需要額外的隊列。