Java中的parallelStream
一、概述
Java 中的 parallelStream 的底层实现为 ForkJoinPool 。
线程池是所有并行流共享的。
线程池的线程数量和CPU核数一致。
需要等待任务全部执行完毕,主线程(调用线程)才继续往下执行。
注意:因为线程池是全局共享的,所以我们尽量不要在 parallelStream 中执行阻塞任务,否则会影响到整个系统中其他的 parallelStream 任务执行的。
二、案例
下面的案例中使用了2个新线程,在其中分别执行 parallelStream 。
线程A启动后,我们暂停2秒,目的是为了让线程A中的任务占满 ForkJoinPool 中的线程,并且每个任务执行后,要暂停10秒,目的是为了方便我们观察 ForkJoinPool 中总共有多少个线程。
public static void main(String[] args) {try {// 构建list数据List list = new ArrayList<>(20);for (int i = 0; i < 20; i++) {list.add(i);}// 启动第一个线程,在里面执行Thread t_A = new Thread(() -> {list.parallelStream().forEach((i) -> {System.out.println(i + "=====A=====" + Thread.currentThread().getName());try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}});});t_A.start();// 暂停2秒Thread.sleep(2000);//执行第二个线程Thread t_B = new Thread(() -> {list.parallelStream().forEach((i) -> {System.out.println(i + "=====B=====" + Thread.currentThread().getName());});});t_B.start();t_A.join();t_B.join();} catch (InterruptedException e) {e.printStackTrace();}}
执行结果如下:
注意查看,首先线程A中的任务执行了12条(包括调用线程自身),我使用的电脑CPU为12核心。
2秒钟后,线程B开始执行,此时线程A中的12个线程还处于阻塞状态,线程B中的任务,全部由调用线程执行。
12=====A=====Thread-0
6=====A=====ForkJoinPool.commonPool-worker-9
7=====A=====ForkJoinPool.commonPool-worker-6
2=====A=====ForkJoinPool.commonPool-worker-2
8=====A=====ForkJoinPool.commonPool-worker-11
4=====A=====ForkJoinPool.commonPool-worker-4
5=====A=====ForkJoinPool.commonPool-worker-15
1=====A=====ForkJoinPool.commonPool-worker-13
3=====A=====ForkJoinPool.commonPool-worker-8
9=====A=====ForkJoinPool.commonPool-worker-1
0=====A=====ForkJoinPool.commonPool-worker-10
17=====A=====ForkJoinPool.commonPool-worker-3
12=====B=====Thread-1
14=====B=====Thread-1
13=====B=====Thread-1
11=====B=====Thread-1
10=====B=====Thread-1
17=====B=====Thread-1
19=====B=====Thread-1
18=====B=====Thread-1
16=====B=====Thread-1
15=====B=====Thread-1
6=====B=====Thread-1
5=====B=====Thread-1
8=====B=====Thread-1
9=====B=====Thread-1
7=====B=====Thread-1
2=====B=====Thread-1
4=====B=====Thread-1
3=====B=====Thread-1
1=====B=====Thread-1
0=====B=====Thread-1
13=====A=====ForkJoinPool.commonPool-worker-11
18=====A=====ForkJoinPool.commonPool-worker-3
15=====A=====ForkJoinPool.commonPool-worker-9
10=====A=====ForkJoinPool.commonPool-worker-4
19=====A=====ForkJoinPool.commonPool-worker-10
16=====A=====ForkJoinPool.commonPool-worker-1
11=====A=====ForkJoinPool.commonPool-worker-13
14=====A=====ForkJoinPool.commonPool-worker-8
Java中的parallelStream相关推荐
- Java中lambda表达式去重_JAVA8中Lambda和Stream
Java8于2014年3月份发布,其主要更新的特性有:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等,本文将介绍Lambda表达式 ...
- java中无限大_Java 9中的无限集
java中无限大 一套 甲Set是元素的集合,从而在任何给定的元件Set只出现一次. 更正式地说,集合不包含元素e1和e2对,因此e1.equals(e2) . 我们可以像这样在Java 9中轻松创建 ...
- Java中Lambda表达式的使用(转)
https://www.cnblogs.com/franson-2016/p/5593080.html 简介 (译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖" ...
- Java中Lambda表达式和stream的使用
Java中Lambda表达式和stream的使用 转自 [*https://www.cnblogs.com/franson-2016/p/5593080.html*] 简介 (译者注:虽然看着很先进, ...
- 在 Java 中如何加快大型集合的处理速度
什么是 Java 集合 尽管 Java 已经过了 25 岁生日,仍然是当今最受欢迎的编程语言之一.超过 100 万个网站通过某种形式在使用 Java,超过 三分之一 的软件开发人员的工具箱中有 Jav ...
- Java中Stream的使用
Java中Stream的使用 请先了解Lambda表达式的用法,有一定Lambda基础后再进行Stream学习. Lambda博文链接:Lambda表达式的详解 本文来自于B站博主:倜傥的雷哥 的视频 ...
- Java中Steam流的用法及使用备忘
文章目录 Java中Steam流的用法及使用备忘 一. 流的常用创建方法 1-1 使用Collection下的 stream() 和 parallelStream() 方法 1-2 使用Arrays ...
- Java中的Stream API简述
Stream API Stream API概述 为什么要使用Stream API Stream是什么? Stream 的操作:三个步骤 1- 创建 Stream 创建 Stream方式一:通过集合 创 ...
- Java中那些让你爱不释手工具库,精炼代码量
Java中那些让你爱不释手工具库,精炼代码量 一.JDK1.8 Stream新特性 1.Stream流的常见生成方式 ①Collection体系的集合可以使用默认方法stream()生成流 //lis ...
- 再也不担心问到Java集合了,一文讲透Java中的数据结构
Java数据结构实现详解 摘要 1 集合框架 1.1 顶层接口Iterable 1.2 Collection接口 2 List 2.1 List接口 2.2 List实现ArrayList 2.2.1 ...
最新文章
- setup.py安装
- 明星软件工程师的十种特质
- expect安装编译方法
- 第94:受限玻尔兹曼机
- 11月AI大事件回顾:GPT3开放使用/女娲视觉大模型/AE文艺复兴/...
- 人工智能相关领域的国际顶尖会议介绍
- python接管已经打开的浏览器_Python Webdriver 从新使用已经打开的浏览器实例
- 20+个很棒的Android开源项目
- 【人脸识别】基于matlab人脸识别检测脸、眼、鼻子和嘴【含Matlab源码 178期】
- html5 统计图 等值线,浅谈WebGIS等值线模态前端展示生成绘制(算法经验)
- 恒生杭州历年软件测试笔试题,【恒生电子软件测试面试】首先做一个笔试题,然...-看准网...
- java与设计模式-观察者模式
- android微信逆向工程,iOS逆向 - 微信自动添加好友
- Xmind教程-添加外框
- [GXYCTF2019]BabyUpload
- OKRs-E,OKR实战基础理论
- 【20230204】Ubuntu系统备份与恢复
- CoaoaChina开发者小测验常识题
- PS肤色调整19大秘诀
- Unity【话大】设计模式之模板方法模式