package com.zzj.concurrency;
import java.io.IOException;
import java.util.Random;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
/**
* 计算一千万个1到100之间的数值之和
* @author lenovo
*
*/
public class ForkJoinTest2 {
static int[] nums = new int[10000000];
static int max_num = 50000;
static{
Random r = new Random();
for (int i = 0; i < nums.length; i++) {
nums[i] = r.nextInt(100);
}
long s = 0L;
for (int i = 0; i < nums.length; i++) {
s += nums[i];
}
System.out.println(s);
}
/**
* 有返回值
* @author lenovo
*
*/
static class AddTask extends RecursiveTask<Long>{
private static final long serialVersionUID = 1L;
private int start;
private int end;
public AddTask(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
if (end - start <= max_num) {
long s = 0;
for (int i = start; i < end; i++) {
s += nums[i];
}
return s;
} else {
int middle = start + (end - start) / 2;
AddTask addTask1 = new AddTask(start, middle);
AddTask addTask2 = new AddTask(middle, end);
addTask1.fork();
addTask2.fork();
return addTask1.join() + addTask2.join();
}
}
}
public static void main(String[] args) throws IOException {
ForkJoinPool pool = new ForkJoinPool();
AddTask addTask = new AddTask(0, nums.length);
pool.execute(addTask);
System.out.println(addTask.join());
}
}
输出结果:
495036487
495036487