乐趣区

java并发编程学习之线程的ForkJoin-框架基本概念一

思想

把大任务分割成多个小任务,再把小任务的结果汇总,最终得到大任务的结果。

步骤如下:

  1. 任务分割
  2. 结果汇总

示例图

工作窃取

指的是线程从其他线程窃取任务来执行。当一个大任务分割成多个小任务的时候,为了减少线程之间的竞争,把小任务放在不同的队列里,每个队列都分配一个线程来执行任务。当一个线程执行完当前队列的任务时,他就会去窃取其他队列的任务来执行。由于都是同一个队列执行小任务,为了减少线程之间的竞争,窃取任务的时候,从队列的尾部拿任务。

  • 优点:充分利用了线程的计算,减少线程之间的竞争
  • 缺点:

    1. 消耗系统资源,比如创建线程和多个双端队列。
    2. 当双端队列只有一个任务时,线程之间会竞争。

示例图

ForkJoinTask

实现了 Future 的接口,主要的子类有 RecursiveAction 和 RecursiveTask。

  • RecursiveAction:有返回值
  • RecursiveTask:没有返回值

ForkJoinPool

通过调用 invoke 来执行 ForkJoinTask 的任务。

退出移动版