Java8 如何正确高效的使用并行流

Java8 如何正确高效的使用并行流

什么是并行流

在 Java8 中,我们可以使用 Stream API 提供的 parallel() 方法来创建并行流,将一个大任务划分成多个小任务并行执行。

如何使用并行流

小心使用

并行流虽然可以大大提高执行效率,但是在使用时需要小心,因为它并不是万能的,有时候反而会降低效率。以下是一些使用并行流时需要注意的点:

  • 并行流不一定更快:不要觉得用了并行流就一定比串行流快,它并不是适用于所有场景的。在数据处理量不够大以及流的初始数据结构不适合分成多个部分计算时,并行流的效果不如串行流。
  • 并行流会导致更多的上下文切换:并行流必须通过线程池来执行,而线程的创建、切换、销毁都需要额外的时间。因此,当数据处理速度不够快或者线程池的容量不够大时,会出现更多的上下文切换,导致效率降低。
  • 并行流可能无序:当数据源是集合时,使用并行流会导致数据的处理结果无序输出。这是因为并行流对于集合内部的数据处理顺序是不保证的。

示例一:计算 1 到 100 的和

首先使用串行流:

long sum = Stream.iterate(1L, i -> i + 1)
                 .limit(100)
                 .reduce(0L, Long::sum);

再使用并行流:

long sum = Stream.iterate(1L, i -> i + 1)
                 .limit(100)
                 .parallel()
                 .reduce(0L, Long::sum);

可以通过运行时间比较来看并行流的效果:

long start = System.currentTimeMillis();
long sum = Stream.iterate(1L, i -> i + 1)
                 .limit(1000000000L)
                 .reduce(0L, Long::sum);
System.out.println("result: " + sum + ", time: " + (System.currentTimeMillis() - start));

start = System.currentTimeMillis();
sum = Stream.iterate(1L, i -> i + 1)
            .limit(1000000000L)
            .parallel()
            .reduce(0L, Long::sum);
System.out.println("result: " + sum + ", time: " + (System.currentTimeMillis() - start));

输出结果:

result: 500000000500000000, time: 3587
result: 500000000500000000, time: 2080

可以看到,使用并行流比串行流快了不少。

示例二:将字符串转为大写并排序

使用串行流:

List<String> strings = Arrays.asList("a", "c", "b", "d");
List<String> upperStrings = strings.stream()
                                   .map(String::toUpperCase)
                                   .sorted()
                                   .collect(Collectors.toList());

再使用并行流:

List<String> strings = Arrays.asList("a", "c", "b", "d");
List<String> upperStrings = strings.parallelStream()
                                   .map(String::toUpperCase)
                                   .sorted()
                                   .collect(Collectors.toList());

由于只有四个元素,所以并行流比串行流慢了不少。

总结

并行流可以大大提高程序的执行效率,但是一定要小心使用,避免出现效率反而降低的情况。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java8 如何正确高效的使用并行流 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • Spring 项目常用pom文件的依赖

    针对“Spring 项目常用pom文件的依赖”,以下是一份完整的攻略: 一、介绍 在 Spring 项目中,我们通常需要引入一些依赖包才能完成各种功能。为了方便管理这些依赖,Maven 项目中采用了 pom.xml 文件来描述和管理项目依赖。在 pom.xml 文件中,我们可以配置项目中所需要的依赖和其版本号等相关信息。在 Spring 项目中,有许多常用的…

    Java 2023年5月19日
    00
  • 腾讯云服务器tomcat端口无法访问的解决方法

    请看下面的详细攻略: 背景 当我们在使用腾讯云服务器上的Tomcat时,可能会遇到无法通过端口访问Tomcat的情况,通常会提示404错误。这种情况可能是由于一些配置或端口使用不正确导致的。 本文将介绍如何解决腾讯云服务器Tomcat端口无法访问的问题。 解决方法 检查云服务器配置 首先,我们需要检查云服务器的配置是否正确。 登录到腾讯云控制台,在左侧导航栏…

    Java 2023年5月20日
    00
  • application对象统计所有用户对某网页的访问次数

    要统计所有用户对某网页的访问次数,可以使用应用程序(Application)对象。以下是进行这项任务的攻略: 步骤一:创建计数器 要跟踪访问次数,我们需要一个计数器。使用应用程序对象中的 OnStart 事件和 Application.Lock 方法创建一个计数器并将其初始化为1。然后使用 Application.UnLock 方法解锁应用程序对象。 Sub…

    Java 2023年6月15日
    00
  • jsp网页计数器实现示例

    下面是“JSP网页计数器实现示例”的完整攻略,该攻略包括以下步骤: 1. 在JSP页面中添加计数器代码 要在JSP页面中添加计数器,需要先在页面的头部导入计数器的Java类,然后在页面中使用JSP脚本将计数器的初始化以及计数器在页面上的输出实现。 示例代码: <%@ page import="com.example.Counter"…

    Java 2023年6月15日
    00
  • JavaSE文件操作工具类FileUtil详解

    JavaSE文件操作工具类FileUtil详解 简介 JavaSE中提供了File类用来操作文件或目录。但是,操作文件或目录的流程较为繁琐,如果我们需要经常操作文件或目录,就需要编写大量的重复代码。为了解决这个问题,我们可以将文件操作的常用方法封装在一个工具类中,从而减少代码量和提高开发效率。本文将介绍一个JavaSE文件操作的工具类FileUtil。 Fi…

    Java 2023年5月19日
    00
  • java页面中文乱码的解决办法

    针对你提出的问题:“java页面中文乱码的解决办法”,我准备分享以下完整攻略: 1. 确认编码方式 首先要确认在哪些地方需要进行编码方式的确认和设置,这些地方包括: 页面的 meta 标签 操作系统的全局编码设置 服务器的编码设置 web.xml 我们需要依次去检查这些地方是否将编码方式设置为正确的 UTF-8。 下面给出两个示例。 示例 1:在 meta …

    Java 2023年5月20日
    00
  • 关于maven环境的安装及maven集成idea环境的问题

    下面是关于maven环境的安装及maven集成idea环境的问题的完整攻略。 1. Maven环境的安装 1.1 下载Maven 首先,需要从Maven官网上下载最新版的Maven。可以访问以下网址: https://maven.apache.org/download.cgi 选择最新版本的二进制zip文件,下载后解压缩到本地。 1.2 配置环境变量 在Ma…

    Java 2023年5月20日
    00
  • Java web含验证码及权限登录实例代码

    下面是“Java web含验证码及权限登录实例代码”的完整攻略: 准备工作 在开始编写代码前,我们需要准备一些工作: 确保已经安装好Java开发环境,并且熟悉Java web开发基础知识。 安装一个Web服务器,比如Tomcat。 准备好一个关系数据库,比如MySQL。 功能概述 我们这里实现的是一个带有验证码和权限登录控制的Java Web应用。功能包括:…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部