2012-12-04 34 views
16

我剛開始考慮Java的Executors類和newCachedThreadPool()方法。根據API,生成的線程池將重新使用現有的Thread對象來執行新任務。緩存線程池如何重用現有線程

我有點困惑,這是如何實現的,因爲我找不到Thread API中的任何方法,它允許您設置現有Thread對象的行爲。

例如,你可以從一個Runnable對象,這使得Thread呼叫Runnablerun()方法創建一個新的Thread。但是,Thread API中沒有設置方法,它將Runnable作爲參數。

我會很感激任何指針。

+0

答案IOW:一個'Thread'執行幾乎相同的任務(或者我應該說任務的子集)作爲Runnable和ExecutorService的組合,除了後一個組合爲您提供更多功能以利用的。如此以至於你應該真的*考慮你爲什麼單獨使用'Thread'。 – BAR

回答

2

執行者會在後臺爲您做所有事情。是的,它只使用現有的線程API。

下面鏈接有使用Thread類和集合API實現的線程池的簡單實現:http://www.ibm.com/developerworks/library/j-jtp0730/index.html

+0

由於某種原因,我的第一條評論沒有發佈。感謝澄清。當我發佈這個問題時,我錯誤地認爲這些線程並不知道線程池的內部信息。 –

4

線程池有找工作可運行的線程。該線程不會從Runnable開始一個新線程,而只會調用功能run()。因此,ThreadPool中的線程不是使用您提供的Runnable創建的,而是用於檢查是否有任何任務已準備好執行並直接調用它們的線程。

因此,這將是這個樣子:

while(needsToKeepRunning()){ 
    if(hasMoreTasks()){ 
     getFirstTask().run();. 
    } 
    else 
    { 
     waitForOtherTasks(); 
    } 
} 

當然這是過於簡化了等待真正實現更優雅。的信息,如何真正的作品可以在Concurrency in Practice

+0

謝謝。得到它了。 (並感謝所有其他人回答我的問題。) –

2

找到一個偉大的水源井線程只需要撥打其上分配給他的可運行Runnable.run() ...

3

線程都在創建只有一次線程池API(除非線程突然退出某些異常情況除外)

工作線程輪詢隊列以查看是否有任務並使用它。所以線程永遠不會退出。

這只是一個抽象,線程被重用(抽象因爲他們從來沒有真正停止)。顯然,它們在空閒超時和關機請求後停止。

Runnable接口----->線程池(有些工作者線程佔用該Runnable和其他等待一些更多的Runnable)

20

基本上想象從池中的每個線程這樣做:

public void run() { 
    while(true) { 
     if(tasks available) { 
      Runnable task = taskqueue.dequeue(); 
      task.run(); 
     } else { 
      // wait or whatever 
     } 
    } 
} 
2

一個簡單的解釋是,當您將Runnable傳遞給ExecutorService時,Runnable將放入隊列中。 ThreadPool工作線程從此隊列讀取並調用排隊的Runnables run()方法。

+0

謝謝。當我發佈這個問題時,我假定'Thread's不知道線程池的實現。 –