2017-02-08 30 views
1

如果我有一個固定大小的線程池,它何時會實際調用Thread.start()來啓動線程? (它會啓動這些它被創建時,還是會等到我開始提交任務?)在線程池中創建實際的線程

+0

你的問題對我來說不是很清楚。 – Sid

+0

可能的重複[如何Threadpool重用線程和它如何工作](http://stackoverflow.com/questions/19765904/how-threadpool-re-use-threads-and-how-it-works) – Calculator

回答

1

如果創建一個固定大小的線程池是這樣的:

ExecutorService es = Executors.newFixedThreadPool(5); 

沒有線程最初創建。當您提交第一個任務時,只創建一個線程(它被命名爲「pool-1-thread-1」)

對於每個額外提交的任務,創建一個新的線程直到指定的固定大小在這個例子中),即使任務沒有真正並行運行

如果,例如,您只能提交3個任務,只有3個線程將具有以下名稱創建: pool-1-thread-1 pool-1-thread-2 pool-1-thread-3

這種優化是重要的,因爲創建一個新的線程是一個資源大量的操作。

任何使用LockSupport.Park方法將當前未執行任務的線程置於等待模式。

當所有線程忙於執行任務時,其他提交的任務將放入阻塞隊列,等待線程變爲可用狀態。

所以要回答你的問題,線程只在任務第一次提交時纔開始運行。

該信息對於JDK 7是正確的。我沒有檢查過其他實現。

+0

我認爲這個答案會受益於一些參考或支持細節。 (該行爲是否在某處指定?是否在所有JDK實現中都是如此?) – ruakh

+0

@Gray:我不明白您的意見。您是否說過您查看了特定JDK實現的源代碼並確認了vstrom編碼器的解釋準確地描述了該實現的行爲?如果是這樣,那麼請考慮編輯答案以表明您已經確認它是正確的特定JDK實現(並指向相關代碼的鏈接)。 – ruakh

+0

是的,我有@ruakh。例如,任何sun開發工具包都有src.zip。可以從這裏獲得openjdk源代碼:http://download.java.net/openjdk/jdk8/不幸的是,這些代碼都不可鏈接。 – Gray