JDK8-并行流与串行流(七)

来源:互联网 发布:linux安装git服务器 编辑:程序博客网 时间:2024/05/22 00:52
package cn.wcj.jdk8.lambda.test;import java.util.concurrent.RecursiveTask;/** * * <p>Title:ForkJoinCalc </p>* <p>Description:ForkJoin框架并行计算 </p>* <p>Company:Software College </p> * @author SuccessKey(WangCJ)* @date 2017年6月20日 下午7:12:09 */public class ForkJoinCalc extends RecursiveTask<Long>{    private static final long serialVersionUID = 8897912131234L;    private Long start  ;    private Long end    ;    private static final long THRESHOLD = 10000L; //临界值    public ForkJoinCalc() {}    public ForkJoinCalc(Long start, Long end) {        this.start = start;        this.end = end;    }    @Override    protected Long compute() {        Long len=end-start   ;        if(len<=THRESHOLD){            Long sum=0L  ;            for(Long x=start;x<=end;x++)                sum+=x  ;            return sum ;        }else{            Long middle=(start+end)/2   ;            ForkJoinCalc left=new ForkJoinCalc(start, middle);            left.fork()  ;  //拆分,并将该子任务压入线程队列            ForkJoinCalc right=new ForkJoinCalc(middle, end) ;             right.fork()   ;            return left.join()+right.join()   ;        }    }}
package cn.wcj.jdk8.lambda.test;import static org.junit.Assert.*;import java.util.OptionalLong;import java.util.concurrent.ForkJoinPool;import java.util.concurrent.ForkJoinTask;import java.util.stream.LongStream;import org.junit.Test;/** * * <p>Title:ForkJoinTest </p>* <p>Description:并行计算测试 </p>* <p>Company:Software College </p> * @author SuccessKey(WangCJ)* @date 2017年6月20日 下午7:20:06 */public class ForkJoinTest {    @Test    public void test1() {        long start = System.currentTimeMillis() ;        ForkJoinPool pool = new ForkJoinPool();        ForkJoinTask<Long> task = new ForkJoinCalc(0L,10000000000L) ;        Long sum=pool.invoke(task)  ;        System.out.println(sum);        long end = System.currentTimeMillis()   ;        System.out.println("耗时:"+(end-start))  ;  //79248    }    @Test    public void test2(){        long start = System.currentTimeMillis() ;        Long sum=0L;        for (long i = 0L; i <= 10000000000L; i++) {            sum+=i   ;        }        System.out.println(sum);        long end = System.currentTimeMillis()   ;        System.out.println("耗时:"+(end-start))  ;  //70002    }    @Test    public void test3(){        long start = System.currentTimeMillis() ;        OptionalLong reduce = LongStream.range(0L, 10000000000L)                  .parallel()                  .reduce(Long::sum)   ;        System.out.println(reduce.getAsLong());        long end = System.currentTimeMillis()   ;        System.out.println("耗时:"+(end-start))  ;  //6212    }}
原创粉丝点击