如果我有一個固定大小的線程池,它何時會實際調用Thread.start()
來啓動線程? (它會啓動這些它被創建時,還是會等到我開始提交任務?)在線程池中創建實際的線程
回答
如果創建一個固定大小的線程池是這樣的:
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是正確的。我沒有檢查過其他實現。
我認爲這個答案會受益於一些參考或支持細節。 (該行爲是否在某處指定?是否在所有JDK實現中都是如此?) – ruakh
@Gray:我不明白您的意見。您是否說過您查看了特定JDK實現的源代碼並確認了vstrom編碼器的解釋準確地描述了該實現的行爲?如果是這樣,那麼請考慮編輯答案以表明您已經確認它是正確的特定JDK實現(並指向相關代碼的鏈接)。 – ruakh
是的,我有@ruakh。例如,任何sun開發工具包都有src.zip。可以從這裏獲得openjdk源代碼:http://download.java.net/openjdk/jdk8/不幸的是,這些代碼都不可鏈接。 – Gray
- 1. Java中實際停止()線程的線程池?
- 2. 何時創建線程池?
- 3. 如何創建線程池?
- 4. Node實際創建多少個線程?
- 5. 如何在nodejs中創建線程池?
- 6. 在c中創建線程池#
- 7. 如何在Kotlin中創建線程池
- 8. Python的線程/線程池的實現
- 9. 線程池中的線程
- 10. 使用System.Threading.Tasks.Parallel在線程池中創建新線程?
- 11. 線程池實現
- 12. 使用在線程池線程上創建的BitmapImage
- 13. .NET中創建線程池(C#)
- 14. 線程池的實現
- 15. 線程的實際用途
- 16. 多線程 - 新線程vs線程池
- 17. 使用Boost線程和io_service創建線程池
- 18. 通過線程池處理器相關性和線程創建
- 19. 線程池最大線程
- 20. 線程池中的線程狀態
- 21. 線程池中的活動線程號
- 22. 線程池中線程的可用性?
- 23. 終止線程池中的線程
- 24. pthread退出線程池中的線程
- 25. 如何創建和線程池
- 26. hystrix如何創建其線程池
- 27. 在JAX-RS api中實現線程池
- 28. 在調用期間在WCF服務中創建後臺線程,佔用ASP .NET線程池中的線程?
- 29. 如何創建多個線程池(即多個執行程序,每個線程池都有一個線程)
- 30. Java:在服務器應用程序中創建線程池
你的問題對我來說不是很清楚。 – Sid
可能的重複[如何Threadpool重用線程和它如何工作](http://stackoverflow.com/questions/19765904/how-threadpool-re-use-threads-and-how-it-works) – Calculator