ForkJoin
什么是ForkJoin?
ForkJoin在JDk1.7 并行执行任务!提高效率 大数据量
大数据:Map Reduce(把大任务拆成小任务)
ForkJoin特点:工作窃取
这里面维护的都是双端队列
package com.xizi.forkjoin;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.stream.LongStream;
/**
* 求和任务
* ForkJoin Stream并行流
*/
/*
如何使用forkjoin
1.forkjoinPool 通过它来执行
2.计算任务 forkjoinPool.execute(ForkJoinTask task)
3.计算类要继承 ForkJoinTask
*/
public class ForkJoin extends RecursiveTask<Long> {
private Long start;
private Long end;
private Long temp = 10000L;
public ForkJoin(Long start, long end) {
this.start = start;
this.end = end;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
test(); //sum=500000000500000000时间: 7416
test2(); //sum=500000000500000000时间: 10713
test3();//sum=500000000500000000时间: 270
}
public static void test(){
long start = System.currentTimeMillis();
Long sum = 0L;
for (Long i = 0L; i <= 10_0000_0000L; i++) {
sum += i;
}
long end = System.currentTimeMillis();
System.out.println("sum="+sum+"时间: "+(end-start));
}
public static void test2() throws ExecutionException, InterruptedException {
long start = System.currentTimeMillis();
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoin task = new ForkJoin(0L, 10_0000_0000L);
ForkJoinTask<Long> submit = forkJoinPool.submit(task);
Long sum = submit.get();
long end = System.currentTimeMillis();
System.out.println("sum="+sum+"时间: "+(end-start));
}
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("sum="+sum+"时间: "+(end-start));
}
@Override
protected Long compute() {
if ((end - start) < temp) {
Long sum = 0L;
for (Long i = start; i <= end; i++) {
sum += i;
}
return sum;
} else {
long middle = (start + end) / 2;
ForkJoin task1 = new ForkJoin(start, middle);
task1.fork();//拆分任务,把任务压入线程队列
ForkJoin task2 = new ForkJoin(middle+1, end);
task2.fork();//拆分任务,把任务压入线程队列
return task1.join()+task2.join();
}
}
}