//RecursiveTask 递归任务publicclassForkJoinDemoextendsRecursiveTask<Long>{private Long start ;private Long end;private Long temp =1000000L;publicForkJoinDemo(Long start,Long end){this.start = start;this.end = end;}@Overrideprotected Long compute(){
Long sum =0L;if((end-start)<temp){for(long i = start; i < end; i++){
sum +=i;}}else{
Long middle =(start + end)/2;
ForkJoinDemo forkJoinDemo1 =newForkJoinDemo(start,middle);//拆分任务
forkJoinDemo1.fork();
ForkJoinDemo forkJoinDemo2 =newForkJoinDemo(middle+1L,end);
forkJoinDemo2.fork();//将返回值相加
sum = forkJoinDemo1.join()+forkJoinDemo2.join();}return sum;}}
测试
publicclassForkTest{publicstaticvoidmain(String[] args)throws ExecutionException, InterruptedException {test1();test2();//test3();//流的效率最高}publicstaticvoidtest1(){
Long start = System.currentTimeMillis();
Long sum =0L;for(Long i =1L; i <=1000_000_000L ; i++){
sum +=i;}
Long end = System.currentTimeMillis();
System.out.println("sum= "+sum+" 时间: "+(end - start));}publicstaticvoidtest2()throws ExecutionException, InterruptedException {
Long start = System.currentTimeMillis();
ForkJoinDemo forkJoinDemo =newForkJoinDemo(0L,1000_000_000L);
ForkJoinPool forkJoinPool =newForkJoinPool();//异步:submit 方法又返回值,同步:execute 无返回值,
ForkJoinTask<Long> forkJoinTask = forkJoinPool.submit(forkJoinDemo);
Long sum = forkJoinTask.get();
Long end = System.currentTimeMillis();
System.out.println("sum= "+sum+" 时间: "+(end - start));}publicstaticvoidtest3(){
Long start = System.currentTimeMillis();
Long sum = LongStream.rangeClosed(0L,1000_000_000L).parallel().reduce(0, Long::sum);
Long end = System.currentTimeMillis();
System.out.println("sum= "+sum+" 时间: "+(end - start));}}