什么是ForkJoin?
并行执行任务!提高工作效率,大数据量的时候使用!
Map Reduce(把大任务拆分为小任务)
ForkJoin:
ForkJoin的特点:工作窃取!
双端队列
**ForkJoinTask:的两个子类
RecursiveAction 递归事件,没有返回值 RecursiveTask
package com.liao.forkjoin; import java.util.concurrent.RecursiveTask; public class ForkJoinDemo extends RecursiveTask{ private Long start; private Long end; //临界值 private Long temp = 10000L; public ForkJoinDemo(Long start, Long end) { this.start = start; this.end = end; } //计算的方法 @Override protected Long compute() { if ((end - start) < temp) { 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(); } } }
测试类:
package com.liao.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();//6135
//test2();//5668
test3();//192 效率最高
}
public static void test1(){
Long sum = 0L;
long start = System.currentTimeMillis();
for (Long i = 1L; i <= 1000000000; 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();//执行forkjoin必须通过new ForkJoinPool
ForkJoinDemo forkJoinDemo = new ForkJoinDemo(0L, 1000000000L);
//forkJoinPool.execute(forkJoinDemo);//同步执行提交,需要丢入一个计算任务,但是没有结果
ForkJoinTask submit = forkJoinPool.submit(forkJoinDemo);//异步提交
Long aLong = submit.get();
//Long aLong = forkJoinDemo.get();
long end = System.currentTimeMillis();
System.out.println("sum: "+aLong+"时间: "+(end-start));
}
//Sream并行流
public static void test3(){
long start = System.currentTimeMillis();
long reduce = LongStream.rangeClosed(0L, 1000000000L).parallel().reduce(0, Long::sum);//parallel平行的计算
long end = System.currentTimeMillis();
System.out.println("sum: "+reduce+"时间: "+(end-start));
}
}
Stream效率最高



