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

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

Java8中将并行进行了优化,我们可以很容易的对数据进行并行操作。Stream API可以声明性地通过parallel()和sequential()在并行流和顺序流之间进行切换。

在了解并行流之前,我们首先需要了解Fork/Join框架

Fork/Join框架

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

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

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

测试代码

public class ForkJoinCalculate extends RecursiveTask<Long> {

    public static void main(String[] args) {
        // java8之前
        ForkJoinPool pool = new ForkJoinPool();
        ForkJoinTask<Long> task = new ForkJoinCalculate(0, 1000000000L);
        Long sum = pool.invoke(task);

        // java8并行流
        LongStream.rangeClosed(0, 1000000000L)
                .parallel()
                .reduce(0, Long::sum);
    }

    // 处理任务的起始值
    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();
        }
    }
}

原文地址:https://www.cnblogs.com/fx-blog/p/11746938.html

时间: 2024-10-09 04:17:33

Java8新特性 - 并行流与串行流的相关文章

乐字节-Java8新特性-接口默认方法之Stream流(下)

接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 筛选和切片 filter(T -> boolean):保留 boolean 为 true 的元素 limit(long n):返回前 n 个元素 skip(long n):去除前 n 个元素 distinct():去除重复元素,这个方法是通过类的 equals 方法来判断两个元素是否相等的 映射 map

java8新特性——并行流与顺序流

在我们开发过程中,我们都知道想要提高程序效率,我们可以启用多线程去并行处理,而java8中对数据处理也提供了它得并行方法,今天就来简单学习一下java8中得并行流与顺序流. 并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流. Java8中将并行流进行了优化,我们可以很容易的对数据进行并行操作.Stream API可以声明性地通过parallel()与scqucntial()在并行流与顺序流之间进行切换. 一.Fork-Join框架 Fork-Join框架:是java7提供

for循环、并行流、串行流效率比较

User类 import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor; @Builder@Data@AllArgsConstructor@NoArgsConstructorpublic class User { int id; String name; int sex; int age; } 测试类 import org.springframe

java8新特性,使用流遍历集合

在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda表达式增强方法”中,我已经深入解释并演示了通过lambda表达式和方法引用来遍历集合,使用predicate接口来过滤集合,实现接口的默认方法,最后还演示了接口静态方法的实现. 源代码都在我的Github上:可以从 这里克隆. 内容列表 使用流来遍历集合. 从集合或数组创建流. 聚合流中的值. 1.

Java8 新特性 Stream() 创建流

通过Controllere类的Stream()和parallelStream()创建流 //通过集合创建流 @Test public void test1() { String arr[] = new String[]{"a", "b", "c"}; //把数组转换成集合 List<String> list = Arrays.asList(arr); //生成stream流(串行流) Stream<String> stre

JAVA8新特性之 Stream API

重要的 Stream API  : java.util.Stream.* Stream提供了一种高效且简易处理数据的方式 注意:1.Stream自己不会存储元素 2.对Stream进行操作不会改变数据源,相反,会产生一个执有结果的新Stream 3.Stream操作是延迟执行的.只有进行了终止操作才会产生结果 (并行流就是把内容分成多个数据块,并用不同的线程分别处理每个数据块.在Java8 后,Stream API可以声明性的通过parallel()与sequential()在并行流与串行流(顺

JAVA8 新特性简介

特点: 速度更快(HashMap加哈希表,ConcurrentHashMap使用CAS,内存结构无永久区.新增元数据区使用物理内存)代码更少(增加了新的语法 Lambda 表达式)强大的 Stream API便于并行(优化ForkJoin)//JDK8之前 需要自己实现计算过程,下面的省略部分代码public class ForkJoinCalculate extends RecursiveTask<Long> { private long start; private long end; @

Java8新特性 --Stream

一. 创建Stream 创建Stream方式一: 集合类的stream()或 parallelStream() java List<String> list = new ArrayList<>(); Stream<String> stream = list.stream(); 创建Stream方式二: 通过Arrays中的静态方法stream()获取 String[] strings = new String[10]; Stream<String> stre

Java8 新特性之流式数据处理

一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现. 比如我们希望对一个包含整数的集合中筛选出所有的偶数,并将其封装成为一个新的List返回,那么在java8之前,我们需要通过如下代码实现: List<Integer> evens = new ArrayList<>(); for (final Integer num : nums) { if (num % 2 =