使用RecursiveTask进行forkJoin求和 (1)
使用RecursiveTask进行递归拆分任务求和. 可以充分发挥CPU多核的优势!
/*
* Copyright 2016-2022 the original author.All rights reserved.
* Kingstar(honeysoft@126.com)
* The license,see the LICENSE file.
*/
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
/**
* @author Kingstar
* @since 2.0
*/
public class ForkJoinTest3 extends RecursiveTask<Integer> {
private static final long serialVersionUID = 1L;
private final static int THRESHOLD = 10;
private int[] numbers;
private int start;
private int end;
public ForkJoinTest3(int[] numbers, int start, int end) {
this.numbers = numbers;
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
if (end - start < THRESHOLD) {
System.out.println(" from index = " + start + " , toIndex=" + end);
int result = 0;
for (int i = start; i <= end; i++) {
result += numbers[i];
}
return result;
} else {
int mid = (end + start) / 2;
// System.out.println("拆分任务, mid:"+mid);
ForkJoinTest3 task1 = new ForkJoinTest3(numbers, start, mid);
ForkJoinTest3 task2 = new ForkJoinTest3(numbers, mid + 1, end);
task1.fork();
task2.fork();
Integer a2 = task2.join();
Integer a1 = task1.join();
return a1 + a2;
}
}
public static void main(String[] args) {
int numbers[] = new int[100];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = i + 1;
}
// ForkJoinTest3 forkJoinTest=new ForkJoinTest3(numbers, 0, numbers.length-1);
// int a=ForkJoinPool.commonPool().invoke(forkJoinTest);
// System.out.println(a);
ForkJoinPool pool = new ForkJoinPool();
ForkJoinTest3 forkJoinTest3 = new ForkJoinTest3(numbers, 0, numbers.length - 1);
long t1 = System.currentTimeMillis();
pool.invoke(forkJoinTest3);
int sum=forkJoinTest3.join();
System.out.println("结果: "+sum);
long t2 = System.currentTimeMillis();
System.out.println("求和花费的时间: " + (t2 - t1) + " ms");
}
}