對於一個線程池,每一個線程有一個隊列,想象這種場景,有的線程隊列中有大量的比較耗時的任務堆積,而有的線程隊列倒是空的,現象就是有的線程處於飢餓狀態,而有的線程處於消化不良的狀態,這時就須要一種方法來解決這個問題。
須要worksteal,顧名思義就是任務竊取,當一個線程處於飢餓狀態時,它就會去其它的線程隊列中竊取任務,解決線程飢餓致使的效率底的問題。 git
worksteal適用場景是任務之間的耗時相差比較大,即有的任務很耗時,有的任務很快完成,這種用worksteal很合適;若是任務的耗時很平均則不適合,由於竊取任務也是須要搶佔鎖的,會形成額外的消耗。 github
有不少種任務竊取策略,好比從任務最多的線程中竊取或隨機竊取,須要根據實際狀況來選擇。 線程
是每次竊取一個任務仍是竊取一批任務也是須要考量的,若是竊取的一批任務比較耗時,又會致使其它線程來竊取,這樣形成了無謂的消耗;若是一次竊取一個任務,而任務很快完成,這又致使從新竊取,下降了效率。這個粒度也是須要根據實際狀況調整的。blog
參考資料get