并发学习之ForkJoin

三种从一加到一亿的方法

1: 使用ForkJoin的准备工作:先创建一个类,继承RecursiveTask

public class ForkJoinTask extends RecursiveTask<Long> {

    private long start;

    private long end;

    //阈值
    private long tmp = 10000l;

    public ForkJoinTask(Long start, Long end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
        Long sum = 0l;
        if((end - start) < tmp){
            for(Long i = start; i <= end; i++){
                sum += i;
            }
            return sum;
        }else{
            //大于1000的情况下,使用ForkJoin
            Long middle = (end + start)/2;
            ForkJoinTask task1 = new ForkJoinTask(0l,middle);
            task1.fork();
            ForkJoinTask task2 = new ForkJoinTask(middle,end);
            task2.fork();
            return task1.join()+task2.join();
        }
    }
}

2: 三种方法的具体测试代码

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.stream.LongStream;

//三种方法来尝试从一加到100000000的速度
//理论上是 Stream>ForkJoin>直接+
//但是我的电脑测试不理想(Stream>直接加>ForkJoin)

public class ForkDemo1 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //1.用程序得到CPU核数
        System.out.println(Runtime.getRuntime().availableProcessors());
        //2.对方法的测试
//        test1();
        test2();
//        test3();
    }

    //第一种:普通方法  :经过试验:时间为451
    public static void test1(){
        long a = System.currentTimeMillis();
        long sum = 0l;
        for(long i = 0l; i < 10_0000_0000; i++){
            sum += i;
        }
        long b = System.currentTimeMillis();
        System.out.println("时间是: "+(b - a));
        System.out.println(sum);
    }

    //第二种: 使用ForkJoin :经过试验,我的四核电脑使用这个方法所需要的时间极为长久都没有反应
    public static void test2() throws ExecutionException, InterruptedException {

        long a = System.currentTimeMillis();

        //1.创建一个ForkJoinPool线程池
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        //2.实例化所需要处理的任务
        ForkJoinTask task = new ForkJoinTask(0l, 10_0000_0000l);
        //3.利用池对任务进行处理
        java.util.concurrent.ForkJoinTask<Long> submit = forkJoinPool.submit(task);
        //4.得到处理的返回结果
        Long sum = submit.get();

        long b = System.currentTimeMillis();
        System.out.println("时间是: "+(b - a));
        System.out.println(sum);
    }

    //第三种: 使用 Stream并发流来对数据操作 :经过试验:时间为351,比直接+的操作快
    public static void test3(){
        long a = System.currentTimeMillis();

        //流式编程骚操作,里面的方法自己慢慢悟吧
        long sum = LongStream.rangeClosed(0, 10_0000_0000l).parallel().reduce(0, Long::sum);

        long b = System.currentTimeMillis();
        System.out.println("时间是: "+(b - a));
        System.out.println(sum);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值