使用ForkJoin计算20000以内的奇数
定义一个Task 继承 RecursiveTask<>
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.RecursiveTask;
public class Task extends RecursiveTask<List<Integer>> {
static final int THRESHOLD = 500; //最小的子问题范围
private int start;
private int end;
public Task(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected List<Integer> compute() {
if (end - start <= THRESHOLD) {
// 如果任务足够小,直接计算:
List<Integer> list = new ArrayList<>(end - start + 1);
for (int i = start; i < end; i++) {
if (i % 2 == 1) {
list.add(i);
}
}
return list;
}
// 任务太大,一分为二:
int middle = (end + start) / 2;
Task subtask1 = new Task(start, middle);
Task subtask2 = new Task(middle, end);
invokeAll(subtask1, subtask2);
List<Integer> subresult1 = subtask1.join();
List<Integer> subresult2 = subtask2.join();
subresult1.addAll(subresult2);
return subresult1;
}
}
/**
* ForkJoin 方式
*/
public void test01() {
ForkJoinTask<List<Integer>> task = new Task(1, 20000);
long startTime = System.currentTimeMillis();
List<Integer> result = ForkJoinPool.commonPool().invoke(task);
long endTime = System.currentTimeMillis();
System.out.println("forkjoin :" + (endTime - startTime));
}
/**
* 单线程
*/
public void test02() {
long startTime = System.currentTimeMillis();
List<Integer> result = new ArrayList<>(10000);
for (int i = 1; i <= 20000; i++) {
if (i % 2 == 1) {
result.add(i);
}
}
long endTime = System.currentTimeMillis();
System.out.println("单线程:" + (endTime - startTime));
}