JAVA使用ForkJoinPool实现子任务拆分进行数值累加代码示例
SumTask.java
import java.util.concurrent.RecursiveTask; /** * 定义任务和拆分逻辑 * RecursiveTask<Long> 这个是 有返回值的 * 如果不需要返回值可以用 RecursiveAction */ public class SumTask extends RecursiveTask<Long> { /** * 累加的开始值 */ private int begin; /** * 累加的结束值 */ private int end; public SumTask(int begin, int end) { this.begin = begin; this.end = end; } @Override protected Long compute() { long sum = 0; if (end - begin < 100) { //如果两个数值小于100,就不要继续拆分了 直接相加就行 for (int i = begin; i <= end; i++) { sum += i; } return sum; } else { //如果大于100继续拆分 取中间数拆分 int middle = (begin + end) / 2; SumTask sumTask1 = new SumTask(begin, middle); SumTask sumTask2 = new SumTask(middle + 1, end); //分别执行子任务 sumTask1.fork(); sumTask2.fork(); //取出子任务执行的结果 Long sum1 = sumTask1.join(); Long sum2 = sumTask2.join(); //相加 return sum1 + sum2; } } }
使用
public static void main(String[] args) { ForkJoinPool pool=new ForkJoinPool(4); SumTask sumTask=new SumTask(1,10000); //直接获取值 Long sum = pool.invoke(sumTask); System.out.println(sum); ForkJoinTask<Long> task = pool.submit(sumTask); if (task.isCompletedAbnormally()) { //发生异常 打印 System.out.println(task.getException()); } }
-----------------------有任何问题可以在评论区评论,也可以私信我,我看到的话会进行回复,欢迎大家指教------------------------
(蓝奏云官网有些地址失效了,需要把请求地址lanzous改成lanzoux才可以)