浅谈 Fork/Join

fork/join的java7新添加的功能,能够把它理解成一个并发框架。

我们通过fork/join能将一个可分解的大任务。分解成多个子任务同步运行。运行完成后,在将各子任务的结果进行合并,得到终于的结果。

使用fork/join,首先要创建fork/join任务。能够通过继承RecursiveActionRecursiveTask来实现(ForkJoinTask是它们的父类)

  • RecursiveAction 不返回结果
  • RecursiveTask 返回结果

经常用法

  • compute(); 计算方法(分拆的子任务)
  • fork(); // 运行子任务
  • join(); // 子任务结束后返回相应结果

ForkJoinPool
除此之外。java还提供了个ForkJoinPool的工具类。它实现了工作窃取算法,使得空暇线程能够主动分担从别的线程分解出来的子任务。从而让全部的线程都尽可能处于饱满的工作状态。提高运行效率。

经常用法

  • execute(); //异步运行命令
  • invoke()和invokeAll(); // 异步运行命令。并返回相应结果
  • submit(); //异步运行命令,同一时候返回Future对象

使用方式例如以下

class Demo extends java.util.concurrent.RecursiveTask<Integer>{
    int start;
    int end;

    public Demo(int start,int end){
        this.start=start;
        this.end=end;
    }

    @Override
    protected Integer compute() {
        int sum=0;
        int s=start;
        int e=end;
        for(;s<=end;s++){
            sum+=s;
        }
        return sum;
    }
}

@Test
public void test2(){
    //1到1亿。相加等于几   0.37
    Demo demo1=new Demo(1,50000000);
    Demo demo2=new Demo(50000001,100000000);
    demo1.fork();
    demo2.fork();
    System.out.println(demo1.join()+demo2.join());
}

@Test
public void test3(){
    ForkJoinPool fjp=new ForkJoinPool();
    Demo demo1=new Demo(1,50000000);
    Demo demo2=new Demo(50000001,100000000);
    System.out.println(fjp.invoke(demo1)+fjp.invoke(demo2));
}
原文地址:https://www.cnblogs.com/slgkaifa/p/7229688.html