什么是ForkJoin?
并行执行任务!提高工作效率,大数据量的时候使用!
Map Reduce(把大任务拆分为小任务)
ForkJoin:
ForkJoin的特点:工作窃取!
双端队列
**ForkJoinTask:的两个子类
RecursiveAction 递归事件,没有返回值 RecursiveTask<V> 递归任务,有返回值**
package com.liao.forkjoin;
import java.util.concurrent.RecursiveTask;
/**
* 求和计算的任务!
* 如何使用forkjoin
* 1.通过forkjoinPoll来执行
* 2.计算任务forkjoinPoll.execute(ForkJoinTask task)
* 3.
*/
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;
}
//计算的方法
@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<Long> 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效率最高