TOP

多线程编程学习七( Fork/Join 框架).(二)
2019-09-07 07:10:06 】 浏览:111
Tags:线程 编程 学习 Fork/Join 框架

orker 线程就会把任务分配给另外两个 worker,但是它自己却停下来等待不干活了!这样就白白浪费了 Fork/Join 线程池中的一个 worker 线程,导致了4个子任务至少需要7个线程才能并发执行。

比如甲把 400 分成两个 200 后,fork() 写法相当于甲把一个 200 分给乙,把另一个 200 分给丙,然后,甲成了监工,不干活,等乙和丙干完了他直接汇报工作。乙和丙在把 200 分拆成两个 100 的过程中,他俩又成了监工,这样,本来只需要 4 个工人的活,现在需要 7 个工人才能完成,其中有3个是不干活的。

 

ForkJoinPool 由 ForkJoinTask 数组和 ForkJoinWorkerThread 数组组成。ForkJoinTask 数组负责将存放程序提交给 ForkJoinPool 的任务;而 ForkJoinWorkerThread 数组负责执行这些任务,ForkJoinWorkerThread 体现的就是“工作窃取”算法。

  • 当我们调用 ForkJoinTask 的 fork 方法时,程序会调用 ForkJoinWorkerThread 的 pushTask 方法异步地执行这个任务,然后立即返回结果。
  • 当我们调用 ForkJoinTask 的 join 方法时,程序会阻塞当前线程并等待获取结果。

ForkJoinPool 使用 submit 或 invoke 提交的区别:invoke 同步执行,调用之后需要等待任务完成,才能执行后面的代码;submit 是异步执行,只有在 Future 调用 get 的时候会阻塞。

ForkJoinPool 继承自 AbstractExecutorService, 不是为了替代 ExecutorService,而是它的补充,在某些应用场景下性能比 ExecutorService 更好。


多线程编程学习七( Fork/Join 框架).(二) https://www.cppentry.com/bencandy.php?fid=76&id=250323

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇搭建自己的技术博客系列(二)把 .. 下一篇Spring Cloud开发人员如何解决服..