ForkUnirseDemo
package com.xiaozhao.juc.forkjoin;
import java.util.concurrent.RecursiveTask;
/**
* 如何使用forkjoin
* 1.forkjoinPool 通过它来执行
* 2.计算任务forkjoinPool.execute(ForkjoinTask task)
* 3.计算类需要继承ForkjoinTask
*/
public class ForkJoinDemo extends RecursiveTask<Long> {
private Long start;
private Long end;
private Long temp = 10000L;
public ForkJoinDemo(Long start, Long end) {
this.start = start;
this.end = end;
}
public void test(){
}
@Override
protected Long compute() {
if((end-start) < temp){
Long sum = 0L;
for (Long i = start; i <= end; i++) {
sum += i;
}
// System.out.println(sum);
return sum;
}else {
//分支合并计算
Long middle = (start+end) / 2;
/**
* 将任务拆分
*/
ForkJoinDemo task1 = new ForkJoinDemo(start, middle);
task1.fork();//将任务压入线程队列
ForkJoinDemo task2 = new ForkJoinDemo(middle+1,end);
task2.fork();//将任务压入线程队列
Long result = task1.join()+task2.join();
return result;
}
}
}
Prueba
package com.xiaozhao.juc.forkjoin;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.stream.LongStream;
public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// test1();//执行计算1~10亿内求和,共花费时间:8770毫秒=====计算值:500000000500000000
// test2();//执行计算1~10亿内求和,共花费时间:7872毫秒=====计算值:500000000500000000
test3();//执行计算1~10亿内求和,共花费时间:538毫秒=====计算值:500000000500000000
}
public static void test1(){
Long sum = 0L;
long start = System.currentTimeMillis();
for (Long i = 1L; i <= 10_0000_0000; i++) {
sum += i;
}
long end = System.currentTimeMillis();
System.out.println("执行计算1~10亿内求和,共花费时间:"+(end-start)+"毫秒"+"=====计算值:"+sum);
}
public static void test2() throws ExecutionException, InterruptedException {
long start = System.currentTimeMillis();
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinTask<Long> task = new ForkJoinDemo(0L, 10_0000_0000L);
ForkJoinTask<Long> submit = forkJoinPool.submit(task);//提交任务
Long sum = submit.get();
long end = System.currentTimeMillis();
System.out.println("执行计算1~10亿内求和,共花费时间:"+(end-start)+"毫秒"+"=====计算值:"+sum); }
public static void test3(){
long start = System.currentTimeMillis();
//stream并行流
long sum = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0, Long::sum);
long end = System.currentTimeMillis();
System.out.println("执行计算1~10亿内求和,共花费时间:"+(end-start)+"毫秒"+"=====计算值:"+sum);
}
}