思想
把大任务分割成多个小任务,再把小任务的结果汇总,最终得到大任务的结果。
步骤如下:
- 任务分割
- 结果汇总
示例图
工作窃取
指的是线程从其他线程窃取任务来执行。当一个大任务分割成多个小任务的时候,为了减少线程之间的竞争,把小任务放在不同的队列里,每个队列都分配一个线程来执行任务。当一个线程执行完当前队列的任务时,他就会去窃取其他队列的任务来执行。由于都是同一个队列执行小任务,为了减少线程之间的竞争,窃取任务的时候,从队列的尾部拿任务。
- 优点:充分利用了线程的计算,减少线程之间的竞争
-
缺点:
- 消耗系统资源,比如创建线程和多个双端队列。
- 当双端队列只有一个任务时,线程之间会竞争。
示例图
类
ForkJoinTask
实现了Future的接口,主要的子类有RecursiveAction和RecursiveTask。
- RecursiveAction:没有返回值
- RecursiveTask:有返回值
主要的方法:
- fork():再创建一个子任务
- invoke():执行任务
- join():返回计算后的结果
ForkJoinPool
通过调用invoke来执行ForkJoinTask的任务。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。