parallelStream/ForkJoinPool 详解

news2024/10/6 10:42:21

parallelStream

parallelStream是一种并行流, 意为处理任务时并行处理。

parallelStream底层使用的是ForkJoinPoolForkJoinPool是一种工作窃取算法线程池,和分治法的概念一致,可以充分利用多 CPU 的优势,把一个任务拆分成多个"小任务", 把多个"小任务"放到多个处理器核心上并行执行; 当多个"小任务"执行完成之后, 再将这些执行结果合并起来

工作窃取算法线程池

前提是硬件支持, 如果单核 CPU, 只会存在并发处理, 而不会并行

核心概念

调用并行流的API

  1. stringList.parallelStream()
  2. stringList.stream().parallel()
  3. Stream.of(stringList).parallel()

虽然 API 的调用方式不同, 但是底层都是将AbstractPipeline中的parallel标识设置为true

public final S parallel() {
   sourceStage.parallel = true;
   return (S) this;
}

并行流parallerStream的底层都是使用同一个ForkJoinPool,而ForkJoinPool线程数默认为cpu的核心数-1

// 查看内核的可用核数
Runtime.getRuntime().availableProcessors()
// ForkJoinPool线程数
ForkJoinPool.commonPool().getParallelism()

修改默认的线程数量

System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "16");

不建议直接修改commonPool线程数,自行创建一个ForkJoinPool更优

注意点

  1. parallelStream线程不安全问题(加锁/使用线程安全的集合(如ConcurrentHashMap)/集合采用collect()/reduce()操作)
  2. parallelStream 适用的场景是计算密集型的,假如服务器CPU的负载很大,那并不能起到并行计算的作用(尽量不要在paralelSreram操作中使用IO流)
  3. 不要在多线程中使用parallelStream,原因同上,当线程都在争抢CPU时不但没有提升效果,反而还会加大线程切换的开销

ForkJoinPool

工作窃取算法线程池

  1. ForkJoinPool的每个ForkJoinWorkerThread下都维护着一个工作队列(WorkQueue),这是一个双端队列,里面存放的对象是任务ForkJoinTask
  2. ForkJoinWorkerThread在运行中产生新的任务(通常是因为调用了fork())时,会放入工作队列的队尾,并且会在队尾取出任务(LIFO)
  3. ForkJoinWorkerThread在处理自己的工作队列同时,会尝试窃取steal一个任务(来自于刚刚提交到 pool的任务,或是来自于其他工作线程的工作队列),窃取的任务位于其他线程的工作队列的队首(FIFO)
  4. 在遇到join()时,如果需要join的任务尚未完成,则会先处理其他任务,直到目标的任务方法被告知已经结束(isDone()),所有的任务都是无阻塞的完成

自定义ForkJoinPool并行流

public void mission() {
    try {
        List<Long> idList = Lists.newArrayList(1L, 2L, 3L);

        ForkJoinPool pool = new ForkJoinPool(20);
        pool.submit(() -> {
            idList.parallelStream().forEach(uid -> {
                //do something
            });
        });
        // 等待任务执行完毕
        pool.awaitTermination(2, TimeUnit.SECONDS);
        log.info("mission done");
    } catch (InterruptedException e) {

    }

若需要等待所有任务执行完毕,可使用下述方式

  1. ForkJoinPool#awaitTermination()
  2. 显式submit任务,使用ForkJoinTask#get()阻塞
  3. CountDownLatch
public void mission() {
    try {
        List<Long> idList = Lists.newArrayList(1L, 2L, 3L);

        CountDownLatch countDownLatch = new CountDownLatch(1);
        ForkJoinPool pool = new ForkJoinPool(20);
        pool.submit(() -> {
            idList.parallelStream().forEach(uid -> {
                //do something
            });
            countDownLatch.countDown();
        });
        // 等待任务执行完毕
        countDownLatch.await();

        log.info("mission done");
    } catch (InterruptedException e) {

    }

参考资料:

  1. 谨慎使用 Java8 新特性 parallelStream
  2. ParallelStream的陷阱
  3. ForkJoinPool线程池—独门专访

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云计算盛宴即将揭幕,re:Invent创新方向提前剧透

作为数字时代广大企业不可或缺的IT基础设施&#xff0c;云计算已经当仁不让地成为了数字经济的技术底座&#xff0c;同时也成为了当前全球备受关注和最热门的产业之一。作为云计算技术的开创者和领导者&#xff0c;亚马逊云科技自从2006年推出全球首个云计算服务以来&#xff0…

OpenCV图像特征提取学习三,LBP图像特征检测算法

一、LBP特征的概述 LBP指局部二值模式&#xff0c;英文全称&#xff1a;Local Binary Pattern&#xff0c;是一种用来描述图像局部特征的&#xff0c;LBP特征具有灰度不变性和旋转不变性等显著优点。同时是一种描述图像特征像素点与各个像素点之间的灰度关系的局部特征的非参数…

NestJS学习:控制器

参考 控制器 控制器负责处理传入的请求和向客户端返回响应。 控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常&#xff0c;每个控制器有多个路由&#xff0c;不同的路由可以执行不同的操作。 控制器 上一篇文章已经介绍了路由的创建&#xff0c…

Redis缓存何以一枝独秀?以及热门面试题中Redis的核心特性

​Redis的各种数据类型 作为缓存组件&#xff0c;Redis的数据结构整体而言就是key-value类型的键值对&#xff0c;但是Redis对于value类型的支持还是比较丰富的&#xff0c;提供了5种不同的数据结构&#xff0c;可以满足大部分场景的使用诉求。 ​对几种类型的结构特点与使用注…

3天3定制大屏,反向PUA

摘要 本次分享一段无讨价还价余地的单人3天定制化大屏全过程&#xff08;强调说拖拽屏的请绕道,和你想的不一样&#xff09;,要动效、要地图、要流光。天坑的心理博弈到最终解决的过程及技术思路。 前因 没啥征兆突然接到说&#xff0c;要在下周完成2个大屏的定制开发,起初没提…

C51 - 定时器

Contents1> 概述(STC89C51RC/RD)2> 作用: CPU的 "闹钟"3> 工作原理 (16位计数器)[TL0 TH0]: 数据寄存器TF: 定时器<溢出>标志位4> 程序设计1> 概述(STC89C51RC/RD) STC89C51RC/RD 定时器数量: 3个; T0模式:工作模式 模式0: 13位计数器; 模式1: …

理解循环神经网络

理解循环神经网络 之前有一篇文章已经初步介绍过RNN的原理(https://forchenxi.github.io/2021/04/23/nlp-rnn/)&#xff0c;里面其实已经介绍的比较清晰易懂了&#xff0c;这篇文章再来回顾和拓展一下. 首先要知道RNN是一个带有内部环的神经网络&#xff0c;上面的这篇文章中…

港科夜闻|香港科大(广州)校长倪明选教授出席江门双碳实验室第一届理事会一次会议...

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科大(广州)校长倪明选教授出席江门双碳实验室第一届理事会一次会议。11月21日下午&#xff0c;江门双碳实验室召开第一届理事会一次会议&#xff0c;审议通过有关文件&#xff0c;完善实验室组织架构&#xff0c;谋划下…

Python之条件语句逻辑运算符

目录 一、逻辑运算符 1.基本运算符 2.比较运算符 3.赋值运算符 二、 if条件语句 三、循环语句 一、逻辑运算符 1.基本运算符 2.比较运算符 3.赋值运算符 # 条件语句逻辑运算符 print((5 / 2)) print((5 // 2)) print((3 ** 2)) #3的2次方# 递增 # a1 # a1 # print(a) # a,b…

主流的深度学习推理架构有哪些(NCNNN)

AI 技术在具体落地应用方面&#xff0c;和其他软件技术一样&#xff0c;也需要具体的部署和实施。部署对于不同的平台设备上的部署方法和不同的架构工具。目前在人工智能的落地部署方面&#xff0c;各大平台机构都退出了自家的部署平台。 目前市场上应用最广泛的部署工具主要有…

用DIV+CSS技术设计的网上书城网页与实现制作(大一Web课程设计)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Java项目:JSP中华传统美食网站平台管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 作者主页&#xff1a;夜未央5788 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前台与后台&…

【网页设计】基于HTML+CSS+JavaScript学生网上报到系统响应式网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

计算机网络---万维网(WWW)

&#xff08;一&#xff09;WWW的概念与组成结构 万维网&#xff08;World Wide Web&#xff0c;WWW)是一个分布式、联机式的信息存储空间&#xff0c;在这个空间中:一样有用的事物称为一样“资源”&#xff0c;并由一个全域“统一资源定位符”(URL&#xff09;标识。这些资源通…

Scala的简单语法介绍

文章目录变量声明语句块if语句for循环while、do while数组Map映射tuple元组变量声明 //在Scala中val用于定义常量&#xff0c;var用于定义变量 var var_i 1 var_i 1val val_i 1 val_i 1 val_i 2运行结果如下&#xff1a; 可以看到&#xff0c;常量是初始复制就确定了&am…

Hello Erupt

前言 本系列将直接以Erupt的分布式方案为路线进行更新。本文的定位是Erupt的HelloWorld。目标&#xff0c;跑起来&#xff0c;让我们看看它是什么样的。 运行起来 准备一个数据库 第一步还是先运行起来。由于最近接触的公司项目都是在使用mysql的驱动&#xff0c;这里我也就…

python+人脸识别+opencv实现真实人脸驱动的阿凡达(上)

目录一、前言二、技术路线三、主要技术点分析(1) 人脸识别模块特征点的漂移(2) 柔性运动与刚性运动的处理setp1 基于人脸特征点的三角剖分setp2 基于三角映射的仿射变换(3) 正脸转侧脸的处理四、小结一、前言 我们在此前的名叫pythonopencv实现人脸微整形博文里已经简单地实现…

Java GUI图形编程 使用awt和swing 制作简易计算器的工具包含源码和讲解 / java练习项目

系列文章目录 提示&#xff1a;阅读本章之前&#xff0c;请先阅读目录 文章目录系列文章目录前言一、常规配置1. 设置窗口大小2. 获取当前屏幕的尺寸3. 窗口居中4. 设置窗口名称5. 添加监听器&#xff0c;关闭窗口6. 设置窗口可见性7. 设置文本框不可编辑8. 设置文本框提示9. 设…

OpenGL原理与实践——核心模式(六):光照贴图、光源分类以及多光源场景主要源码实现

本章主要以代码为主&#xff0c;理论理解即可。详细分析代码 目录 光照贴图 光源分类 平行光 点光源 shader——点光源 聚光灯 聚光灯边缘优化——光强递减 源码解析 main 全局变量、句柄 main函数主体逻辑 createModel() createTexture(const char* _filename) …

骨感传导蓝牙耳机怎么样,骨感传导耳机对于我们耳道是否有保护

在现在数码产品普及生活的时代&#xff0c;耳机也成为了我们每天的标准&#xff0c;以往佩戴的都是入耳式的耳机&#xff0c;但长时间佩戴下会出现耳朵疼痛&#xff0c;严重的更会导致听力障碍的问题发生&#xff0c;针对这一现象&#xff0c;一种新型的骨感传导耳机来到了我们…