2014-02-26 128 views
1

這是我第一次使用Java線程池爲我的新項目,我碰到這個 鏈接http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using-executors-and-threadpoolexecutor.html來了以後,我對這個比較迷茫,這裏是從頁面的代碼,困惑Java的線程池

package com.journaldev.threadpool; 

public class WorkerThread implements Runnable { 

    private String command; 

    public WorkerThread(String s){ 
     this.command=s; 
    } 

    @Override 
    public void run() { 
     System.out.println(Thread.currentThread().getName()+' Start. Command = '+command); 
     processCommand(); 
     System.out.println(Thread.currentThread().getName()+' End.'); 
    } 

    private void processCommand() { 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public String toString(){ 
     return this.command; 
    } 
} 


package com.journaldev.threadpool; 

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class SimpleThreadPool { 

    public static void main(String[] args) { 
     ExecutorService executor = Executors.newFixedThreadPool(5); 
     for (int i = 0; i < 10; i++) { 
      Runnable worker = new WorkerThread('' + i); 
      executor.execute(worker); 
      } 
     executor.shutdown(); 
     while (!executor.isTerminated()) { 
     } 
     System.out.println('Finished all threads'); 
    } 

} 

在代碼中,創建了固定大小的池並創建了10個工作線程,對嗎?

線程池應該可以減輕系統的負擔,相反,在上面的代碼中,我認爲它通過創建池和工作線程來增加負擔。爲什麼還要使用線程池?

任何人都可以解釋嗎? 感謝

我也讀StackOverflow上 http://stackoverflow.com/questions/19765904/how-threadpool-re-use-threads-and-how-it-works 這個帖子並沒有幫助我滿意。

回答

3

這是令人困惑的,因爲Runnables被命名爲WorkerThread,但它們不擴展java.lang.Thread,它們只是實現Runnable的對象。實現Runnable可讓您指定需要執行的任務,而無需實例化實際的Thread對象。您的示例中創建的唯一線程是主線程和Executor創建的線程。

請注意,即使您更改此代碼以使WorkerThread擴展線程,只要代碼不調用它們的啓動,它將不會導致更多線程實際運行。構造一個線程對象涉及到一些事情,比如使用安全管理器進行檢查和初始化線程定位,但實際上並沒有在操作系統級別上分配線程。就Executor而言,它們只是Runnables,它會使用線程池的線程來執行它們。

+0

謝謝,這有助於 –

1

不好的例子!這個名爲WorkerThread的類不是一個線程,它是一個「任務」。

線程隱藏在ExecutorService中。該示例使用五個「worker」線程創建一個ExecutorService,它創建十個任務,它要求執行程序服務「執行」它們,最後等待所有任務完成。完全取決於ExecutorService來決定如何以及何時以及在哪個工作線程中執行每項任務。

該示例的另一個較小問題是主程序在請求執行程序服務關閉後如何等待。它使用可能已經被一個或多個工作人員使用的CPU資源進行了調整(取決於主機有多少個CPU可用來運行各個線程)。等待循環應該調用Thread.yield(),它放棄了主線程的時間片在每次調用時都可以運行到其他可運行線程。

+0

感謝您的澄清 –