根据b站UP主狂神说JUC课程所写的个人学习笔记 视频地址:https://www.bilibili.com/video/BV1B7411L7tE?from=search&seid=14761503393031794075
Forkjoin在jdk1.7,并行执行任务,提高效率,大数据量
大数据:Map Reduce(把大任务拆分为小任务)
Forkjoin特点:工作窃取
维护的都是双端队列
Forkjoin
//求和计算
//3 6(forkjoin) 9 (stream并行流)
//如何使用forkjoin
//1.forkjoinpool
//2.计算任务 //forkJoinPool.execute(ForkJoinTask task)
//3.计算类继承forkjointask
public class ForkjoinDemo extends RecursiveTask<Long> {
private Long start; //1
private Long end; //19999999
private Long temp = 1000000L;
public ForkjoinDemo(Long start, Long end) {
this.start = start;
this.end = end;
}
//计算方法
@Override
protected Long compute() {
if(end-start>=temp){
//分支合并计算
Long mid = (start + end)/2;//中间值
ForkjoinDemo forkjoinDemo = new ForkjoinDemo(start, mid );
forkjoinDemo.fork();//拆分任务,把任务压入线程队列
ForkjoinDemo forkjoinDemo1 = new ForkjoinDemo(mid+1,end);
forkjoinDemo1.fork();
return forkjoinDemo.join() + forkjoinDemo1.join();
}
else{
Long sum = 0L;
for (Long i = start; i < end; i++) {
sum += i ;
}
return sum;
}
}
}
public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
test3();
}
//普通程序员
public static void test1(){
Long sum = 0L;
Long start = System.currentTimeMillis();
for (int i = 0; i < 10_0000_0000; i++) {
sum +=i ;
}
Long end = System.currentTimeMillis();
System.out.println("sum="+sum+"时间:"+(end-start));
}
//会使用forkjoin
public static void test2() throws ExecutionException, InterruptedException {
Long start = System.currentTimeMillis();
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkjoinDemo forkjoinDemo = new ForkjoinDemo(0L, 10_0000_0000L);
ForkJoinTask<Long> submit = forkJoinPool.submit(forkjoinDemo);
Long aLong = submit.get();
Long end = System.currentTimeMillis();
System.out.println("sum="+aLong+"时间:"+(end-start));
}
//stream并行流
public static void test3(){
Long start = System.currentTimeMillis();
long reduce = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0, Long::sum);
Long end = System.currentTimeMillis();
System.out.println("sum="+"时间:"+(end-start));
}
}