1. 概述
从JDK1.7开始,Java提供Fork/Join框架用于并行执行任务,它的思想是将一个大任务分割成若干个小任务,最终汇总每个小任务的执行结果后得到大任务的结果。执行步骤主要有两步:任务拆分和结果合并。其中涉及到工作窃取算法(work-stealing),从其他任务队列尾部窃取任务来执行。
2. 为什么使用工作窃取算法呢?
假如我们需要做一个比较大的任务,我们可以把任务分割为若干个互不依赖的子任务,为了减少线程间的竞争,于是把这些子任务放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应,比如A线程优先处理完队列里任务,而B线程的队列里有等待处理的任务,于是A线程会从B线程的队列里窃取一个任务来帮助执行。此时A、B线程会同时访问同一个队列,因此为了减少窃取任务线程和被窃取任务线程之间的竞争,通常会使用双端队列,被窃取任务线程(B)永远从队列的头部获取任务,而窃取任务线程(A)永远从双端队列的尾部获取任务。
- 优点:充分利用线程进行并行计算,并减少线程间的竞争。
- 缺点:如果双端队列里只有一个任务时会发生竞争关系,创建多个线程和多个双端队列会消耗更多的系统资源。












网友评论