Java教程

Java8新特性_并行流与串行流

本文主要是介绍Java8新特性_并行流与串行流,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

package com.zs.boot.controller;

import java.util.concurrent.RecursiveTask;

public class ForkJoinCalculate extends RecursiveTask<Long> {

    private long start;

    private long end;

    public ForkJoinCalculate(long start, long end) {
        this.start = start;
        this.end = end;
    }

    //临界值
    private static final long THRESHOLD = 10000;

    @Override
    protected Long compute() {
        long length = end - start;
        if(length <= THRESHOLD){
            long sum = 0;
            for (long i = start; i <= end; i++) {
                sum += i;
            }
            return sum;
        }else {
            long middle = (start+end)/2;
            ForkJoinCalculate left = new ForkJoinCalculate(start,middle);
            //拆分子任务,同时压入线程队列
            left.fork();

            ForkJoinCalculate right = new ForkJoinCalculate(middle+1,end);
            right.fork();

            //合并
            return left.join() + right.join();
        }
    }
}
package com.zs.boot.controller;

import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.stream.LongStream;

public class TestForkJoin {
    public static void main(String[] args) {

        /**
         * ForkJoin框架
         */

        //long start = System.currentTimeMillis();
        //想试一下java8的时间
        /*Instant start = Instant.now();

        //需要线程池的支持
        ForkJoinPool pool = new ForkJoinPool();
        ForkJoinTask<Long> task = new ForkJoinCalculate(0, 10000000000L);
        Long sum = pool.invoke(task);
        System.out.println(sum);

        Instant end = start.now();
        System.out.println("耗费时间为:"+Duration.between(start, end).toMillis()+"毫秒");*/


        /**
         * 普通for循环,单线程
         */
        /*Instant start1 = Instant.now();
        long sum1 = 0L;
        for (long i = 0; i <= 10000000000L; i++) {
            sum1 +=i;
        }
        System.out.println(sum1);
        Instant end1 = Instant.now();
        System.out.println("耗费时间为:"+Duration.between(start1, end1).toMillis()+"毫秒");*/


        //测试总结:累加1亿,看不出效果,for循环看不出效果,累加100亿就能看出来了
        /*累加1亿:
        5000000050000000
        耗费时间为:553毫秒
        5000000050000000
        耗费时间为:296毫秒

        累加100亿:
        -5340232216128654848
        耗费时间为:19193毫秒
        -5340232216128654848
        耗费时间为:21043毫秒
        */


        /**
         * 但是ForkJoin框架应用的不广泛,因为操作起来非常的麻烦,所以java8改进了,
         * 下面看java8中怎么完成
         */
        //java8并行流
        Instant start2 = Instant.now();
        Long sum2 = LongStream.rangeClosed(0,10000000000L)
                .parallel()//底层是ForkJoin
                .reduce(0,Long::sum);
        System.out.println(sum2);
        Instant end2 = Instant.now();
        System.out.println("耗费时间为:"+Duration.between(start2, end2).toMillis()+"毫秒");
        /*可以看到明显快了
        -5340232216128654848
        耗费时间为:13761毫秒*/
    }
}

这篇关于Java8新特性_并行流与串行流的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!