首页 > 编程语言 > 详细

Java 多线程 - Fork-Join

时间:2020-09-20 20:39:25      阅读:43      评论:0      收藏:0      [点我收藏+]

Fork-Join原理

任务fork,结果join

技术分享图片

 

 

工作密取

即当前线程的 Task 已经全被执行完毕,则自动取到其他线程的 Task 池中取 出 Task 继续执行。

ForkJoinPool 中维护着多个线程(一般为 CPU 核数)在不断地执行 Task,每 个线程除了执行自己职务内的 Task 之外,还会根据自己工作线程的闲置情况去 获取其他繁忙的工作线程的 Task,如此一来就能能够减少线程阻塞或是闲置的时 间,??高 CPU 利用率。

技术分享图片

 

 

 

Fork-Join标准范式

我们要使用 ForkJoin 框架,必须首先

1. 创建 ForkJoinPool

2. 创建一个 ForkJoinTask 任务, 提供在任务中执行 fork 和 join 的操作机制。 通常我们不直接继承 ForkjoinTask 类,只需要直接继承其子类 RecursiveTask, RecursiveAction:

  • RecursiveAction,用于没有返回结果的任务
  • RecursiveTask,用于有返回值的任务

 

技术分享图片 

3. ForkJoinTask 要通过 ForkJoinPool 来执行,使用 submit 或 invoke ??提交,两者的区别是: invoke 是同步执行,调用之后需要等待任务完成,才能执行后面的代码; submit 是异步执行。

4. 通过 ForkJoinTask 的 join() 和 get() 方法当任务完成的时候返回计算结果。

 

技术分享图片

 

在我们自己实现的 compute 方法里,首先需要判断任务是否足够小,如果 足够小就直接执行任务。如果不足够小,就必须分割成两个子任务,每个子任务 在调用 invokeAll 方法时,又会进入 compute 方法,看看当前子任务是否需要继 续分割成孙任务,如果不需要继续分割,则执行当前子任务并返回结果。使用 join 方法会等待子任务执行完并得到其结果。

 

Java 多线程 - Fork-Join

原文:https://www.cnblogs.com/frankcui/p/13700890.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!