2011-11-17 144 views
1

我正在使用4線程的ExecutorJava多線程不能正常工作

Executor exec = Executors.newFixedThreadPool(this.numOfThreads); 
     Runnable requestHandler = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        getImageForURL(spURL, 0); 
       } catch (IOException ex) { 
       } catch (Exception ex) { 
       } 
      } 
     }; 
     exec.execute(requestHandler); 

getImageForURL,我打印線程的名稱和輸出看起來是這樣的。輸出看起來不正確,或者它是如何看起來的?

name=pool-1-thread-1 
name=pool-2-thread-1 
name=pool-3-thread-1 
name=pool-4-thread-1 
name=pool-5-thread-1 
name=pool-6-thread-1 
name=pool-7-thread-1 
name=pool-8-thread-1 
name=pool-9-thread-1 
name=pool-10-thread-1 
name=pool-11-thread-1 
name=pool-12-thread-1 
name=pool-13-thread-1 
name=pool-14-thread-1 
+2

你認爲Java的多線程不工作之前,你應該假設你也許做錯了什麼。 –

回答

4

您每次都創建一個新池(通過反覆調用newFixedThreadPool)。您可能只想創建一次池(當您啓動程序時),並向其提交多個requestHandler

輸出應該然後看是這樣的:

name=pool-1-thread-1 
name=pool-1-thread-1 
name=pool-1-thread-2 
name=pool-1-thread-1 
name=pool-1-thread-1 
name=pool-1-thread-2 

與線程數上升到4,如果池被充分利用。

+0

我在循環內創建了執行程序。取出它的循環,並按照你所說的工作,謝謝 – user373201

1

你希望你的循環環繞只需調用exec.execute(requestHandler),而不是你在那裏的整個代碼塊,否則你將每次創建一個新的線程池。

如果你身邊只是調用exec.execute(requestHandler)循環,那麼你的輸出應該是這個樣子(該語句的順序可能會有所不同):

pool-1-thread-1 
pool-1-thread-4 
pool-1-thread-3 
pool-1-thread-2 
pool-1-thread-3 
pool-1-thread-4 
pool-1-thread-1 
pool-1-thread-4 
pool-1-thread-3 
+0

感謝您的及時響應 – user373201