2012-11-19 109 views
0

我有一個場景,其中兩個threadPool實例共享相同的阻塞隊列。下面是代碼ThreadPoolExecutor共享相同的阻塞隊列

<bean id="TaskQueue" class="java.util.concurrent.LinkedBlockingQueue"> 
     <constructor-arg type="int"> 
      <value>1000</value> 
     </constructor-arg> 
    </bean> 

    <bean id="TaskThreadPool1" class="java.util.concurrent.ThreadPoolExecutor"> 
     <constructor-arg type="int"> 
      <value>10</value> 
     </constructor-arg> 
     <constructor-arg type="int"> 
      <value>50</value> 
     </constructor-arg> 
     <constructor-arg type="long"> 
      <value>5</value> 
     </constructor-arg> 
     <constructor-arg> 
      <value>SECONDS</value> 
     </constructor-arg> 
     <constructor-arg> 
      <ref bean="TaskQueue" /> 
     </constructor-arg> 
    </bean> 


    <bean id="TaskThreadPool2" class="java.util.concurrent.ThreadPoolExecutor"> 
     <constructor-arg type="int"> 
      <value>1</value> 
     </constructor-arg> 
     <constructor-arg type="int"> 
      <value>1</value> 
     </constructor-arg> 
     <constructor-arg type="long"> 
      <value>5</value> 
     </constructor-arg> 
     <constructor-arg> 
      <value>SECONDS</value> 
     </constructor-arg> 
     <constructor-arg> 
      <ref bean="TaskQueue" /> 
     </constructor-arg> 
    </bean> 

現在我有一個問題,會是什麼,如果我將在TaskThreadPool2通過TaskThreadPool2.execute(任務)提交超過5任務行爲。

我覺得TaskThreadPool1也應該開始執行這些任務bcoz它也在監聽同一隊列。

+2

數據確實是代碼。 – Perception

回答

0

真的不能想到有兩個線程池用於相同阻塞隊列的原因。找出最好的方法是製作一個程序並運行它。

說了不需要有兩個這樣的池,增加了池的大小加倍。

此外,如果您想要有兩個池,請檢查併發性,因爲可能存在兩個池中的一個線程嘗試訪問隊列中的相同資源的情況。這可能會導致不可預知的結果。

0

不,TaskThreadPool1不會執行隊列中的任務,請參閱ThreadPoolExecutor構造函數(源) - 它不會開始監聽工作隊列。你可以很容易地測試它:

BlockingQueue<Runnable> q = new LinkedBlockingQueue<Runnable>(); 
    Runnable r = new Runnable() { 
     public void run() { 
      System.out.println("running"); 
     } 
    }; 
    q.add(r); 
    q.add(r); 
    ThreadPoolExecutor ex1 = new ThreadPoolExecutor(10, 50, 5, TimeUnit.SECONDS, q); 

運行它,沒有任何反應,ex1忽略隊列中的任務。但是,添加此

ex1.execute(r); 

你會看到

running 
    running 
    running 

執行人與執行激活()。

+0

那是不正確的。它正在發生bcoz,執行方法未被調用到threadPool之一。一旦你調用execute方法,它將啓動工作線程,然後它將開始監聽。那麼我們將有兩個池監聽相同的隊列,我們​​將獲得無處不在的響應。 – user1834733