拆分fork+合并join。jdk1.7整合Fork/Join,性能上有大大提升。
思想:充分利用多核CPU把计算拆分成多个子任务,并行计算,提高CPU利用率大大减少运算时间
当你在ForkJoinPool中执行ForkJoinTask时,你可以使用同步或异步方式来实现。当你使用同步方式时,提交任务给池的方法直到提交的任务完成它的执行,才会返回结果。当你使用异步方式时,提交任务给执行者的方法将立即返回,所以这个任务可以继续执行。
你应该意识到这两个方法有很大的区别,当你使用同步方法,调用这些方法(比如:invokeAll()方法)的任务将被阻塞,直到提交给池的任务完成它的执行。这允许ForkJoinPool类使用work-stealing算法,分配一个新的任务给正在执行睡眠任务的工作线程。反之,当你使用异步方法(比如:fork()方法),这个任务将继续它的执行,所以ForkJoinPool类不能使用work-stealing算法来提高应用程序的性能。在这种情况下,只有当你调用join()或get()方法来等待任务的完成时,ForkJoinPool才能使用work-stealing算法。
异步的简单实例如下:
public class ForjoinTest extends RecursiveTask<Integer> {
private int start;
private int end;
public ForjoinTest(int start, int end) {
this.start = start;
this.end = end;
}
//计算
@Override
protected Integer compute() {
int sum = 0;
if (start - end < 100) {
for (int i = start; i < end; i++) {
sum += i;
}
} else {//间隔有100则拆分多个任务计算
int middle = (start + end) / 2;
ForjoinTest left = new ForjoinTest(start, middle);
ForjoinTest right = new ForjoinTest(middle + 1, end);
left.fork();
right.fork();
sum = left.join() + right.join();
}
return sum;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
ForkJoinPool forkJoinPool = new ForkJoinPool();//对线程池的扩展
Future<Integer> result = forkJoinPool.submit(new ForjoinTest(1, 1000000));
System.out.println(result.get());
forkJoinPool.shutdown();
}