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日

相关文章

  • Java多线程、进度条实现赛马实验的示例代码

    请看下面的攻略。 Java多线程、进度条实现赛马实验的示例代码攻略 1. 基本概述 本文将着眼于如何使用Java实现一个多线程、进度条等相关功能,并以赛马模拟游戏为例,演示Java实现多线程、界面进度条样例代码的具体过程。 在Java中,提供了多线程编程的支持,可以使用Thread,Runnable等类来实现。 为了在界面上显示进度条,我们需要使用Java …

    Java 2023年5月19日
    00
  • JavaEE中用response向客户端输出中文数据乱码问题分析

    JavaEE中用Response向客户端输出中文数据时,由于编码方式的不同,可能会出现乱码问题。下面是解决该问题的完整攻略。 问题分析 出现中文乱码的原因是由于Java和浏览器显示中文时采用的编码方式不同。Java默认使用UTF-8编码,而浏览器则存在多种编码方式,如GB2312、GBK、UTF-8等。在Response输出响应的过程中,需要将Java编码方…

    Java 2023年5月20日
    00
  • Idea启动多个SpringBoot项目的3种最新方案

    在Idea中启动多个SpringBoot项目是一个常见的需求,本文将详细讲解三种最新方案,以及两个示例。 方案一:使用Idea的多模块项目 在Idea中,我们可以使用多模块项目来启动多个SpringBoot项目。以下是一个简单的示例: 创建一个多模块项目,包含多个SpringBoot模块。 在每个模块中,创建一个SpringBoot启动类,并使用@Sprin…

    Java 2023年5月15日
    00
  • Java输入数据的知识点整理

    Java输入数据的知识点整理 在Java编程中,输入数据是非常重要的一部分,如果没有正确的输入数据,程序很难执行下去。本文将详细介绍Java输入数据的知识点整理,包括以下内容: Java.util.Scanner类 标准输入流和标准输出流 System.console()方法 示例说明 Java.util.Scanner类 Scanner类为读取用户输入提供…

    Java 2023年5月26日
    00
  • MyBatis入门实例教程之创建一个简单的程序

    首先我们需要明确一下MyBatis的基础知识。MyBatis是一个持久层框架,可以与关系型数据库进行交互。在使用MyBatis时,我们需要进行以下三步操作: 配置数据源:需要在MyBatis的配置文件中配置数据库的连接信息。 编写Mapper文件:Mapper文件是MyBatis的核心,用于描述SQL语句以及与Java对象之间的映射关系。 执行SQL语句:通…

    Java 2023年5月20日
    00
  • javaweb实战之商城项目开发(三)

    “javaweb实战之商城项目开发(三)”是一篇关于Java web商城项目的开发经验分享文章,旨在帮助读者更深入地理解Java web应用的开发及实践。本文的主要内容包括:前端页面开发、后端接口实现及数据库设计等方面。 前端页面开发 在前端页面开发方面,本文主要讲解了如何使用HTML、CSS、JavaScript以及JSP技术实现商城首页、商品详情页、购物…

    Java 2023年5月24日
    00
  • 详解spring security安全防护

    详解Spring Security安全防护 什么是Spring Security Spring Security是Spring Framework的子项目,它提供了一种基于Spring的安全框架来保护Java应用程序。Spring Security可以处理身份验证和授权,可以保护Web应用程序和非Web应用程序。 Spring Security的核心概念 S…

    Java 2023年5月20日
    00
  • 详解Spring Security怎么从数据库加载我们的用户

    下面我就来详细讲解如何用Spring Security从数据库中加载用户。 1. 创建数据表 首先我们需要在数据库中创建数据表,用于存储我们的用户信息,常用的表结构如下: CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(45) NOT NULL, …

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