Java——多线程高并发系列之Fork/Join框架简单应用

Posted 张起灵-小哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java——多线程高并发系列之Fork/Join框架简单应用相关的知识,希望对你有一定的参考价值。

1.Fork/Join框架简介 

Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join 框架要完成两件事情:

Fork:把一个复杂任务进行分拆,大事化小 :把一个复杂任务进行分拆,大事化小

Join:把分拆任务的结果进行合并

在 Java 的 Fork/Join 框架中,使用两个类完成上述操作:

ForkJoinTask: 我们要使用 Fork/Join 框架,首先需要创建一个 ForkJoin 任务。该类提供了在任务中执行 fork 和 join 的机制。通常情况下我们不需要直接集成 ForkJoinTask 类,只需要继承它的子类,Fork/Join 框架提供了两个子类:

  1. RecursiveAction:用于没有返回结果的任务
  2. RecursiveTask:用于有返回结果的任务

ForkJoinPool:  ForkJoinTask 需要通过 ForkJoinPool 来执行。

RecursiveTask:  继承后可以实现递归(自己调自己)调用的任务。

可以在jdk官方文档中看到:


2.简单应用

实现从 1 + 2 + ... + 100 ,将它们拆分成多个小任务,分别求和,最终再将这些结果合并。

这里就是参照官方文档,先继承RecursiveTask类,重写其中的compute方法,然后定义有参构造,而ForkJoinTask需要通过 ForkJoinPool 来执行,所以还需要创建 分支合并池ForkJoinPool对象。

package test.forkjoin;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

/**
 *
 */
class MyTask extends RecursiveTask<Integer> {
    //拆分差值不能超过10,每次计算10以内的连加操作
    private static final Integer NUMBER = 10;
    private int begin; //拆分左区间的值
    private int end; //拆分右区间的值
    private int result; //最终结果

    public MyTask(int begin,int end) {
        this.begin = begin;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        //判断区间差值是否大于10
        if ((end - begin) <= NUMBER) {
            //将区间内的值依次相加
            for (int i = begin; i <= end; i++) {
                result += i;
            }
        } else { //区间差值大于10,进一步拆分
            //获取中间值
            int middle = (begin + end) / 2;
            //拆分的左区间
            MyTask taskLeft = new MyTask(begin,middle);
            //拆分的右区间
            MyTask taskRight = new MyTask(middle + 1,end);
            //fork方法进行拆分
            taskLeft.fork();
            taskRight.fork();
            //join方法进行合并
            result = taskLeft.join() + taskRight.join();
        }
        return result;
    }
}

public class ForkJoinDemo {
    public static void main(String[] args) {
        //创建MyTask对象
        MyTask myTask = new MyTask(1,100);
        //创建分支合并池对象
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
        try {
            //获取最终合并后的结果
            Integer ans = forkJoinTask.get();
            System.out.println(ans);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //关闭池对象
            forkJoinPool.shutdown();
        }
    }
}

以上是关于Java——多线程高并发系列之Fork/Join框架简单应用的主要内容,如果未能解决你的问题,请参考以下文章

多线程高并发编程 -- Fork/Join源码分析

多线程高并发编程 -- Fork/Join源码分析

Java并发多线程编程——Fork/Join框架

Java——多线程高并发系列之创建多线程的三种方式(ThreadRunnableCallable)

Java——多线程高并发系列之创建多线程的三种方式(ThreadRunnableCallable)

Java——多线程高并发系列之线程池(Executor)的理解与使用