美文网首页java
并行流与串行流——java8 新特性(3)

并行流与串行流——java8 新特性(3)

作者: 神奇作手 | 来源:发表于2019-09-25 22:15 被阅读0次

一、概述

并行流 就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。
  Stream API 可以声明性的通过 parallel() 与 sequential() 在并行流与顺序流之间进行切换。

一、Fork/Join 框架

Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆分时),再将一个个的小任务运算的结果进行 join 汇总。

1、Fork/Join 框架与传统线程池的区别

  采用“工作窃取” 模式(work-stealing):
当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加到线程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的队列中。
  相对于一般的线程池实现,fork/join 框架的优势体现再对其中包含的任务的处理方式上,在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态,而在fork/join 框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行,那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行,这种方式减少了线程的等待时间,提高了性能。

2、Fork/Join 框架的使用
package com.Stream2;

import java.util.concurrent.RecursiveTask;

/**
 * 多线程累加数据
 */
public class ForkJoinCalculate extends RecursiveTask<Long> {


    private long start;
    private long end;

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

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

    @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.Stream2;

import org.junit.Test;
import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.ForkJoinPool;
import java.util.stream.LongStream;

/**
 * 测试
 */
public class TeskForkJoin {

    @Test
    public void test1(){
        Instant start = Instant.now();

        ForkJoinPool pool = new ForkJoinPool();
        ForkJoinCalculate task = new ForkJoinCalculate(0, 10000000000L);
        Long sum = pool.invoke(task);
        System.out.println(sum);

        Instant end = Instant.now();
        System.out.println("消耗时间:"+ Duration.between(start,end).toMillis());//2312
    }

    /**
     * 普通 for
     */
    @Test
    public void test2(){
        long sum = 0L;
        Instant start = Instant.now();

        for (long i = 0; i <= 10000000000L; i++){
            sum += i;
       }
        System.out.println(sum);

        Instant end = Instant.now();
        System.out.println("消耗时间:"+ Duration.between(start,end).toMillis());//3036
    }

    /**
     * Java8 并行流
     */
    @Test
    public void test3(){
        Instant start = Instant.now();

        long l = LongStream.rangeClosed(0, 10000000000L)
                .parallel()
                .reduce(0, Long::sum);

        System.out.println(l);
        Instant end = Instant.now();
        System.out.println("消耗时间:"+ Duration.between(start,end).toMillis());//1650
    }
}

相关文章

  • 并行流与串行流——java8 新特性(3)

    一、概述   并行流 就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。  Stream AP...

  • Java8的新特性--并行流与串行流

    写在前面 我们都知道,在开发中有时候要想提高程序的效率,可以使用多线程去并行处理。而Java8的速度变快了,这个速...

  • 2019-02-02——Java8 Stream

    Stream分为两种: 串行流——stream() 并行流——parallelStream() Stream的特性...

  • Java_Stream流

    目录1.什么是Stream2.API功能举例-- 2.1 串行流与并行流-- 2.1.1 串行流与并行流的获取方式...

  • 六 串行流与并行流

    并行流就是把一个内容分成多个数据块,并用不同多线程分别处理每个数据块的流。串行流显然就是流的处理任务是串行化的。J...

  • Java8新特性系列(Optional)

    上期我们介绍了Java中的流性能,并行流的应用场景,本期我们介绍Java8种的另一个新特性:Optional。 背...

  • 并行流和串行流

    并行流 并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。 Java8中将并行进行了优化,...

  • 并行流和串行流

  • 串行流和并行流

    串行流=单线程,并行流=同时操作 并行就是吧一个内容分成多个数据块,同时处理每个数据块的流。相比较串性的流可以很大...

  • Stream流

    Stream流 java8新特性 Stream定义 A sequence of elements supporti...

网友评论

    本文标题:并行流与串行流——java8 新特性(3)

    本文链接:https://www.haomeiwen.com/subject/movwuctx.html