2012-04-30 112 views
2

試圖圍繞Java併發進行打包,並且難以理解線程池,線程和它們正在執行的可運行「任務」之間的關係。Java:線程池如何將線程映射到可運行的線程

如果我用10個線程創建一個線程池,那麼我是否必須將相同的任務傳遞給池中的每個線程,或者是合併的線程實際上只是與任務無關的「工人無人機」可供執行任何任務?

無論哪種方式,Executor/ExecutorService如何將正確的任務分配給正確的線程?

回答

7

通常,線程池由一個生產者 - 消費者隊列實現,所有池線程等待任務。執行者不必分配任務,只需將他們推送到隊列中即可。一些線程,一個'任務不可知的工人無人機',將彈出任務,執行其'run()'方法,並在完成後循環再次等待隊列以進行更多工作。

2

如果我用10個線程創建一個線程池,那麼我是否必須將相同的任務傳遞給池中的每個線程,或者將池中的線程字面上只是任務無關的「工人無人機」執行任何任務?

或多或少後者。任何給定的任務被分配到下一個可用線程。

無論哪種方式,Executor/ExecutorService如何將正確的任務分配給正確的線程?

有沒有這樣的事情作爲「正確的」線程。該任務(即Runnable)需要進行設計,以便哪個線程運行它並不重要。這通常不是問題......假設您的應用程序正確地將訪問/更新同步到可能由多個線程使用的數據。