什么是FoekJoin?分之合并
FoekJoin在JDK 1.7出来的,并行执行任务,大数据量!(一个线程并发成多个去处理的)
大数据:Map Reduce(把大任务拆分成小任务)
ForkJoin特点:工作窃取
这个里面维护的都是双端队列
当B线程先执行完自己的任务后,会把A没有执行的任务窃取过来,自己执行,提高工作效率
ForkJoin例子
代码:
package com.qiu.forkjion;
import java.util.concurrent.RecursiveTask;
/**
* 求和计算的任务 forkjoin -->(Stream并行流
* 如何使用ForkJoin
* 1.forkjoinpool通过它来执行
* 2.计算任务:forkjoinpool.execute(ForkJoinTask task)
* 3.计算类要继承ForkjoinTask
*
*/
public class Demo01 extends RecursiveTask<Long> {
private Long start;
private Long end;
//临界值
private Long temp = 10000L;
public Demo01(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;//中间值
//一个大任务拆成了两个任务
Demo01 task1 = new Demo01(start,middle);
Demo01 task2 = new Demo01(middle+1,end);
task1.fork();//拆分任务,把线任务压入线程队列
task2.fork();//拆分任务,把线任务压入线程队列
long l= task1.join()+task2.join();
return l;
}
}
}
package com.qiu.forkjion;
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();//6667ms
test2();//6601ms
test3();//215ms
}
//普通求和
public static void test1(){
long start =System.currentTimeMillis();
Long sum=0L;
for (Long i = 0L; i <= 10_0000_0000; i++) {
sum+=i;
}
System.out.println(sum);
long end = System.currentTimeMillis();
System.out.println("sum="+sum+"时间:"+(end-start));
}
//使用FoekJoin
public static void test2() throws ExecutionException, InterruptedException {
long start =System.currentTimeMillis();
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinTask<Long> task = new Demo01(0L,10_0000_0000L);
ForkJoinTask<Long> submit = forkJoinPool.submit(task);//提交任务
//System.out.println(submit);
Long sum = submit.get();
long end = System.currentTimeMillis();
System.out.println("sum="+sum+"时间:"+(end-start));
}
//Stream 并行流
public static void test3(){
long start =System.currentTimeMillis();
long sum = LongStream.rangeClosed(0L, 10_0000_0000L).parallel().reduce(0, Long::sum);
long end = System.currentTimeMillis();
System.out.println("sum="+sum+"时间:"+(end-start));
}
}
测试结果:
test1();//6667ms
test2();//6601ms
test3();//215ms
笔记自己看视频做的,视频链接如下:
B站地址:https://space.bilibili.com/95256449