51,408
社区成员
发帖
与我相关
我的任务
分享
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
public class ForkJoinTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
test1();
System.out.println();
test2();
}
/**
* 直接单线程执行,作为对比
*/
public static void test1(){
Long sum = 0L;
Long start = System.currentTimeMillis();
for (Long i = 1L; i <=10000000000L; i++) {
sum = sum + i;
}
Long end = System.currentTimeMillis();
System.out.printf("结果为:%d,耗时:%d",sum,(end-start));
}
/**
* 使用ForkJoin
*/
public static void test2() throws ExecutionException, InterruptedException {
Long start = System.currentTimeMillis();
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinDemo forkJoinDemo = new ForkJoinDemo(1L,10000000000L);
ForkJoinTask<Long> forkJoinTask = forkJoinPool.submit(forkJoinDemo);
Long sum = forkJoinTask.get();
Long end = System.currentTimeMillis();
System.out.printf("结果为:%d,耗时:%d",sum,(end-start));
}
}
class ForkJoinDemo extends RecursiveTask<Long>{
//临界值设置
private static final long THRESHOLD = 25000000L;
private Long start;
private Long end;
public ForkJoinDemo(Long start, Long end) {
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
if (end-start<=THRESHOLD){
Long sum = 0L;
for (Long i = start; i <= end; i++) {
sum+=i;
}
return sum;
}else{
//ForkJoin
Long middle = (start + end)/2;
//拆分线程
ForkJoinDemo task1 = new ForkJoinDemo(start,middle);
//把线程压入队列
task1.fork();
ForkJoinDemo task2 = new ForkJoinDemo(middle+1,end);
task2.fork();
return task1.join()+task2.join();
}
}
}