面试官: Stream并行流有了解过吗?说说看

简介: 面试官: Stream并行流有了解过吗?说说看

前言

目前正在出一个Java多线程专题长期系列教程,从入门到进阶含源码解读, 篇幅会较多, 喜欢的话,给个关注❤️ ~


本节给大家介绍一下Stream并行流,一起来看下吧~


Stream

Java8以后,提供了Stream接口以及lambda表达式进行流式计算,这使我们非常方便的处理集合问题,代码也变的更加简洁,高效,想必大家也一定用过。


平时大部分处理的都是串行计算,但是某些场景下我们需要处理并行计算,比如上节给大家讲的fork/join它处理起来就相对复杂一点。


Stream并行流

废话不多说,我们直接上代码,先快速的体验一下:

public class StreamTest {
    public static void main(String[] args) {
        Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
                .reduce((a, b) -> {
                    System.out.println(String.format("%s: %d + %d = %d",
                            Thread.currentThread().getName(), a, b, a + b));
                    return a + b;
                })
                .ifPresent(System.out::println);
    }
}
复制代码


实际输出:

main: 1 + 2 = 3
main: 3 + 3 = 6
main: 6 + 4 = 10
main: 10 + 5 = 15
main: 15 + 6 = 21
main: 21 + 7 = 28
main: 28 + 8 = 36
main: 36 + 9 = 45
45
复制代码


我们可以通过当前线程下的输出,可以看出它一直是在main线程下进行计算的,也就是单线程,下面我们再改造一下:

public static void main(String[] args) {
    Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
            .parallel()
            .reduce((a, b) -> {
                System.out.println(String.format("%s: %d + %d = %d",
                        Thread.currentThread().getName(), a, b, a + b));
                return a + b;
            })
            .ifPresent(System.out::println);
}
复制代码


实际输出:

ForkJoinPool.commonPool-worker-1: 3 + 4 = 7
ForkJoinPool.commonPool-worker-4: 8 + 9 = 17
ForkJoinPool.commonPool-worker-6: 1 + 2 = 3
main: 5 + 6 = 11
ForkJoinPool.commonPool-worker-6: 3 + 7 = 10
ForkJoinPool.commonPool-worker-4: 7 + 17 = 24
ForkJoinPool.commonPool-worker-4: 11 + 24 = 35
ForkJoinPool.commonPool-worker-4: 10 + 35 = 45
45
复制代码


可以看到,它是一个并行计算,即在多线程下进行的计算,而且可以看出计算速度有明显的提升。从代码来看,就多了一个parallel方法,这个方法是一个中间操作,它可以返回一个等效的并行流


下面我们再看下List中是如何使用的?

public static void main(String[] args) {
        List<Integer> arr = new ArrayList<>();
        arr.add(1);
        arr.add(2);
        arr.add(3);
        arr.add(4);
        arr.add(5);
        arr.add(6);
        arr.parallelStream().reduce((a, b) -> {
                    System.out.println(String.format("%s: %d + %d = %d",
                            Thread.currentThread().getName(), a, b, a + b));
                    return a + b;
                })
                .ifPresent(System.out::println);
    }
复制代码


实际输出:

ForkJoinPool.commonPool-worker-4: 5 + 6 = 11
ForkJoinPool.commonPool-worker-1: 2 + 3 = 5
ForkJoinPool.commonPool-worker-4: 4 + 11 = 15
ForkJoinPool.commonPool-worker-1: 1 + 5 = 6
ForkJoinPool.commonPool-worker-1: 6 + 15 = 21
21
复制代码


我们可以直接通过parallelStream来获得一个并行流,是不是很方便。


结束语

本节主要讲解它的一个使用,也不是说全部都用stream并行流,当数据特别多的情况下,可以使用它来提高效率,数据特别少的情况,就不建议使用了。下一节,给大家整理一下本期专题的所有内容,供大家方便去阅读,多线程专题就此完结。关注我,不迷路 ~

相关文章
|
Java API
【Java8新特性】面试官:谈谈Java8中的Stream API有哪些终止操作?
如果你出去面试,面试官问了你关于Java8 Stream API的一些问题,比如:Java8中创建Stream流有哪几种方式?(可以参见:《【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?》)Java8中的Stream API有哪些中间操作?(可以参见:《【Java8新特性】Stream API有哪些中间操作?看完你也可以吊打面试官!!》)如果你都很好的回答了这些问题,那么,面试官可能又会问你:Java8中的Stream API有哪些终止操作呢?没错,这就是Java8中有关Stream API的灵魂三问!不要觉得是面试官在为难你,只有你掌握了这些细节,你就可以反过来
342 0
【Java8新特性】面试官:谈谈Java8中的Stream API有哪些终止操作?
|
算法 搜索推荐 Java
【面试题精讲】Java Stream排序的实现方式
【面试题精讲】Java Stream排序的实现方式
|
并行计算 Java 数据挖掘
Java面试题:解释Java中的Stream API及其操作
Java面试题:解释Java中的Stream API及其操作
152 0
【面试题精讲】如何使用Stream的聚合功能
【面试题精讲】如何使用Stream的聚合功能
|
存储 SQL Java
【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?
先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过。真心想对这些读者说:你真的需要了解下Java8甚至以后版本的新特性了。 今天,一名读者出去面试,面试官问他:说说Java8中创建Stream流有哪几种方式?他竟然没回答上来!!
400 0
【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
310 4
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
1960 2
下一篇
oss云网关配置