對於一個線程池,每個線程有一個隊列,想象這種場景,有的線程隊列中有大量的比較耗時的任務堆積,而有的線程隊列卻是空的,現象就是有的線程處於饑餓狀態,而有的線程處於消化不良的狀態,這時就需要一種方法來解決這個問題。
需要worksteal,顧名思義就是任務竊取,當一個線程處於饑餓狀態時,它就會去其它的線程隊列中竊取任務,解決線程饑餓導致的效率底的問題。
worksteal適用場景是任務之間的耗時相差比較大,即有的任務很耗時,有的任務很快完成,這種用worksteal很合適;如果任務的耗時很平均則不適合,因為竊取任務也是需要搶占鎖的,會造成額外的消耗。
有很多種任務竊取策略,比如從任務最多的線程中竊取或隨機竊取,需要根據實際情況來選擇。
是每次竊取一個任務還是竊取一批任務也是需要考量的,如果竊取的一批任務比較耗時,又會導致其它線程來竊取,這樣造成了無謂的消耗;如果一次竊取一個任務,而任務很快完成,這又導致重新竊取,降低了效率。這個粒度也是需要根據實際情況調整的。
worksteal thread pool源碼
參考資料
A Java Fork/Join Framework
Scheduling Multithreaded Computations by Work Stealing