2017-07-28 23 views
0

我對傳統的線程實現很熟悉,但對Executorservice不太確定。使用executor服務處理線程時,我知道這非常方便。但是我對它的實現有點混淆。Executorservice如何在java中工作?

我們假設我有一個父線程/主線程和一個具有最大線程池大小爲10的執行程序服務。現在,我只想在jms隊列上執行某個任務,只要它的大小小於1000。我大概可以考慮以兩種方式來實現這一點。

案例1:

class MyThreadClass inmplements Runnable { 
     public static void main(String args[]){ 
      while(true){ 
       int checkQueueSize = jmsQueue.getSize(); 
       while(checkQueueSize<1000){ 
        threadPoolTaskExecutor.execute(this); 
        ++checkQueueSize; 
       } 
      } 
     } 
     public void run(){ 
      jmsQueue.pushMessage("Hello Thread"); 
     } 
} 

案例2:

class MyThreadClass inmplements Runnable { 
      public static void main(String args[]){ 
      threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); 
       threadPoolTaskExecutor.execute(this); 
      } 
      public void run(){ 
       while(true){ 
        int checkQueueSize = jmsQueue.getSize(); 
        while(checkQueueSize<1000){ 
         jmsQueue.pushMessage("Hello Thread"); 
         ++checkQueueSize; 
        } 
       } 
      } 
    } 

我的理解是情況下2不會跨越多個線程。我正確與否?還是有其他方式來執行任務?

+0

'setWaitForTasksToCompleteOnShutdown'是Spring框架的一部分 - 你在這方面要求? – assylias

+0

是的。但如果有任何其他方式,這是非常受歡迎的。 – Satyaprakash

+0

如果局部變量checkQueueSize小於或等於1000,那麼'while(checkQueueSize <= 1000)'語句將永遠循環。循環中的任何內容都不可能更改變量的值。 –

回答

0

「情況2不會跨越多個線程」是的。這是對的。因爲您只撥打execute一次。

在第一種情況下,您可能會多次撥打execute。而在前面的任務沒有完成的情況下,額外的線程將被毀掉。

+0

那麼我可以假設**案例1 **的實現相當完美嗎? – Satyaprakash

+0

我個人更喜歡不使用「完美」這個詞,但是是的,這就是應該如何使用執行者服務。它也有bug,你應該用'if'替換inner'while'。此外,它會增加一些延遲,否則會消耗大量的處理器時鐘。 – talex

+0

感謝您的建議。但是我不能用'if'替換內部'while',cuz就在內部'while'前面有一個'getSize()'方法,它使用'jmx'連接來獲取'jmsQueue'的大小。所以,如果我用'if'代替inner'while',那麼它會爲每次迭代都要求'jmsQueue'大小,這是一項繁重的操作。無論如何,你在上面的答案領域的建議是我正在尋找的。因此將其標記爲回答。 – Satyaprakash

0

請找我的代碼: -

class MyThreadClass inmplements Runnable { 
     public static void main(String args[]){ 
      threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); 
      for(int i=0;i<10;i++) 
      threadPoolTaskExecutor.execute(this); 
     } 
     public void run(){ 
      while(true){ 
       int checkQueueSize = jmsQueue.getSize(); 

       if(checkQueueSize<=1000){ 
        jmsQueue.pushMessage("Hello Thread"); 
       } 
      } 
     } 
    } 

修改: -

  1. 創建10個線程,並指定由他們通過你的Runnable類對象運行工作。
    1. 刪除不必要的while循環作爲外循環執行infite itaration。
+0

這是很好的建議。但是你不認爲在這種情況下,即使沒有任務執行,線程也不會進入空閒狀態? – Satyaprakash