并发学习之ForkJoin

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。并发学习之ForkJoin,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

三种从一加到一亿的方法

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);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/202570.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!