当前位置: 首页> 财经> 产业 > ForkJoin

ForkJoin

时间:2025/7/9 5:59:49来源:https://blog.csdn.net/2301_79437276/article/details/140072298 浏览次数:0次

线程数超过CPU核心数是没有任何意义的【因为要使用CPU密集型运算】

Fork/Join:线程池的实现,体现是分治思想,适用于能够进行任务拆分的 CPU 密集型运算,用于并行计算

任务拆分:将一个大任务拆分为算法上相同的小任务,直至不能拆分可以直接求解。跟递归相关的一些计算,如归并排序、斐波那契数列都可以用分治思想进行求解

  • Fork/Join 在分治的基础上加入了多线程,把每个任务的分解和合并交给不同的线程来完成,提升了运算效率

  • ForkJoin 使用 ForkJoinPool 来启动,是一个特殊的线程池,默认会创建与 CPU 核心数大小相同的线程池

  • 任务有返回值继承 RecursiveTask,没有返回值继承 RecursiveAction【特殊:不能用Runnable或者Callable了】

 
public static void main(String[] args) {ForkJoinPool pool = new ForkJoinPool(4);System.out.println(pool.invoke(new MyTask(5)));//拆分  5 + MyTask(4) --> 4 + MyTask(3) -->}​// 1~ n 之间整数的和class MyTask extends RecursiveTask<Integer> {private int n;​public MyTask(int n) {this.n = n;}​@Overridepublic String toString() {return "MyTask{" + "n=" + n + '}';}​@Overrideprotected Integer compute() {// 如果 n 已经为 1,可以求得结果了if (n == 1) {return n;}// 将任务进行拆分(fork)MyTask t1 = new MyTask(n - 1);t1.fork();  //执行计算// 合并(join)结果int result = n + t1.join(); //获取上面fork的执行结果return result;}}

继续拆分优化:二分法

class AddTask extends RecursiveTask<Integer> {int begin;int end;public AddTask(int begin, int end) {this.begin = begin;this.end = end;}@Overridepublic String toString() {return "{" + begin + "," + end + '}';}@Overrideprotected Integer compute() {// 5, 5if (begin == end) {return begin;}// 4, 5  防止多余的拆分  提高效率if (end - begin == 1) {return end + begin;}// 1 5int mid = (end + begin) / 2; // 3AddTask t1 = new AddTask(begin, mid); // 1,3t1.fork();AddTask t2 = new AddTask(mid + 1, end); // 4,5t2.fork();int result = t1.join() + t2.join();return result;}}

ForkJoinPool 实现了工作窃取算法来提高 CPU 的利用率:

  • 每个线程都维护了一个双端队列,用来存储需要执行的任务

  • 工作窃取算法允许空闲的线程从其它线程的双端队列中窃取一个任务来执行

  • 窃取的必须是最晚的任务,避免和队列所属线程发生竞争,但是队列中只有一个任务时还是会发生竞争

难在如何拆分,后面JDK8就封装到stream的api了,并行流

关键字:ForkJoin

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: