先貼一個網上常見的對線程池的理解:
很多人也是這么理解的,但是真實情況是,以上結論的第1點是錯誤的,使用線程池不能減少創建和銷毀線程的開銷!
一開始我對線程池的理解是和上面圖片中的結論一樣的,然后就想着自己去寫一個線程池,於是我提前創建了線程,然后准備在添加任務時再使用閑置的線程去執行。
就圖中這一步時,我發現Thread沒有對外提供設置target(要執行的任務)的api接口。
沒有提供接口去設置target,怎么在創建了線程之后去執行target ???
於是,我帶着上面的疑問去看了線程池(ThreadPoolExecutor)的源碼,然后找到了玄機!!!
以下是TheadPoolExecutor的addWorker方法中的部分,重點就是 " new Worker()"
進入到 new worker()的構造方法
實際上是調用 threadFactory重新new了一個線程出來,threadFactory是個接口,有多個實現類,隨便點一個能看到類似下面的代碼:
所以,到這里可以最終確定線程池並沒有如網上流傳的那樣使用閑置線程。
為什么不能先創建線程再設置要執行的任務了? ??
我后來猜想了一下:線程實質是內存的一部分,如果先開辟一段內存作為線程,后面再設置要執行的任務,那么在實際運行時可能會發生實際需要的內存大於已經使用的內存的情況。所以,為了避免這種情況,就設計了創建線程時必須明確指定要執行的任務。
上面這個猜想只是我的個人想法,希望有朋友能一起交流一下,以便確定線程不能后指定任務的真正原因。