package com.model.threadpool; import java.util.concurrent.*; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/6/9 9:16 */ public class ForkJoinDemo { /** *分支合并框架: * ForkJoinPool * ForkJoinTask * RecursiveTask * * 例子:实现0都100的相加,使用分支和合并的方式实现, * 讲0 到100分成0到50和51到100,在讲0到50分。。。 * 最后在和并到一起,多个线程递归实现相加,比一个线程的方式快 * * fork():异步执行任务 * Join():返回完成状态 * 实现了future接口,我们可以直接get返回值 */ public static void main(String[] args) throws ExecutionException, InterruptedException { ForkJoinPool forkJoinPool=new ForkJoinPool(); MyTask myTask=new MyTask(0, 100); ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask); System.out.println(forkJoinTask.get()); forkJoinPool.shutdown(); } } class MyTask extends RecursiveTask<Integer> { private Integer start; private Integer end; private Integer res=0; private static final Integer ADJUST_VALUE=10; public MyTask(Integer start, Integer end) { this.start = start; this.end = end; } @Override protected Integer compute() { if (end-start<=ADJUST_VALUE){ for (int i=start;i<=end;i++){ res+=i; } }else { Integer mobile=(start+end)/2; MyTask myTask=new MyTask(start,mobile); MyTask myTask1=new MyTask(mobile+1, end); myTask.fork(); myTask1.fork(); res=myTask.join()+ myTask1.join(); } return res; } }
原文:https://www.cnblogs.com/zzhAylm/p/14866019.html