浅谈 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));
}

你可能感兴趣的:(并发编程,一个节点的并发编程笔记)