最近再学多线程。突然看到ForkJoinPool这个线程池。以前并不了解
Java 7提供了ForkJoinPool来支持将一个任务拆分成多个“小任务”并行计算,再把多个“小任务”的结果合并成总的计算结果。ForkJoinPool是ExecutorServcie的实现类,因此是一种特殊的线程池。
创建了ForkJoinPool实例之后,可以调用ForkJoinPool的submit(ForkJoinTask task)或者invoke(ForkJoinTask task)方法来执行指定任务了。其中ForkJoinTask代表一个可以并行,合并的任务。有两个抽象的子类RecursiveAction和RecursiveTask。其中RecursiveTask代表有返回值的任务,而RecursiveAction代表没有繁殖的任务。
下面举个例子:
下面以直线没有返回值的“大任务”(打印0-300的数值)为例,程序讲一个“大任务”拆分成多个“小任务”,病将任务交给ForkJoinPool来执行。
class PrintTask extends RecursiveAction
{
//每个小任务最多打印50个数
private static final int THRESHOLD = 50;
private int start;
private int end;
public PrintTask(int start, int end){
this.start = start;
this.end = end;
}
@Override
protected void compute(){
if(end - start < THRESHOLD){
for(int i = start ; i< end ; i++){
System.out.println(Thread.currentThread.getName()+"的i的值"+i);
}
}else{
int middle = (start+end)/2;
PrintTask left = new PrintTask(start,middle);
PrintTask right = new PrintTask(middle,end);
left.fork();
right.fork();
}
}
}
public class ForkJoinPoolTest{
public static void main(String[] args){
ForkJoinPool pool = new ForkJoinPool();
pool.submit(new PrintTask(0,300));
pool.awaitTermination(2,TimeUnit.SECONDS);
pool.shutdown();
}
}