java大数据必须学会的类FoekJoin

什么是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{//分之合并计算,forkjoinlong 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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值