fork/join的java7新增加的功能,可以把它理解成一个并发框架。我们通过fork/join能将一个可分解的大任务,分解成多个子任务同步执行,执行完毕后,在将各子任务的结果进行合并,得到最终的结果。
使用fork/join,首先要创建fork/join任务,可以通过继承RecursiveAction或RecursiveTask来实现(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));
}