概念
任务窃取,也叫work stealing,是指工作线程本身的任务队列为空时, 从其他工作线程的任务队列中窃取任务来执行。
在fork/join篇中, 我们提到, 假如我们要线程池做一些比较大的任务, 做的过程中会把这个任务分割为多个较小的任务(较小的任务也可能分割成更小的任务), 为了减少工作线程对公共任务队列的竞争, 我们让每个工作线程持有一个任务队列, 自己做任务时分割出来的小任务就放到自己的工作队列中。
但是这样会存在一个问题, 初始的任务有大有小, 有的工作线程自己的任务做完了, 其他线程还在忙碌, 从而产生负载不均衡的问题。为了解决这个问题, 人们发明了工作窃取算法, 这个算法的核心很简单, 就是当前工作线程的任务队列为空时, 去其他还有任务的工作线程的任务队列取一个(或多个)任务回来。