parallelStream并行流

1. parallelStream 是并行的

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
numbers.parallelStream().forEach(num->System.out.print(num + " "));
System.out.println();
System.out.println("----------------");

numbers.parallelStream() .forEach(num->System.out.println(Thread.currentThread().getName()+">>"+num));

打印结果:

6 5 3 2 7 9 4 1 8 
----------------
main>>6
ForkJoinPool.commonPool-worker-1>>7
ForkJoinPool.commonPool-worker-4>>1
ForkJoinPool.commonPool-worker-2>>2
ForkJoinPool.commonPool-worker-3>>5
ForkJoinPool.commonPool-worker-6>>3
ForkJoinPool.commonPool-worker-7>>8
ForkJoinPool.commonPool-worker-1>>9
ForkJoinPool.commonPool-worker-5>>4

结论:

从上面的打印结果可以看出,它的输出是并发的
其底层使用Fork/Join框架实现
parallelStream是利用多线程进行的,这可以很大程度简化我们使用并发操作。
我们可以通过虚拟机启动参数
-Djava.util.concurrent.ForkJoinPool.common.parallelism=20
来设置worker的数量。

在虚拟机启动时,我们指定了worker线程的数量,整个程序的生命周期都将使用这些工作线程;
这必然存在任务生产和消费的问题,如果某个生产者生产了许多重量级的任务(耗时很长),
那么其他任务毫无疑问将会没有工作线程可用;更可怕的事情是这些工作线程正在进行IO阻塞。

并行流有线程安全问题,慎用

2. Fork/Join

Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。

Fork/Join 框架要完成两件事情:
Fork:把一个复杂任务进行分拆,大事化小
Join:把分拆任务的结果进行合并

任务分割:
首先 Fork/Join 框架需要把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割。
执行任务并合并结果:分割的子任务分别放到双端队列里,然后几个启动线程分别从双端队列里获取任务执行。
子任务执行完的结果都放在另外一个队列里,启动一个线程从队列里取数据,然后合并这些数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ParallelStreamJava Stream API中的一个方法,它可以让我们以并行的方式对Stream中的元素进行操作。 ParallelStream方法的源码显示,它返回一个可能是并行Stream,但并不一定是并行的。具体是否并行取决于Stream的来源以及其他因素。因此,在使用ParallelStream时需要特别注意。 ParallelStream实现多线程处理的原理是使用ForkJoin框架来调度。ForkJoin框架是Java中用于并行计算的一种机制,它通过将任务划分为更小的子任务,并使用工作窃取算法来实现任务的分配和调度。在ParallelStream中,通过使用ForkJoin框架来并行处理Stream中的元素。具体的实现类包括FindOps.FindOp、ForEachOps、MatchOps.MatchOp和ReduceOps.ReduceOp等。不同的方法可能有不同的实现类,但总体上都是使用ForkJoin框架来实现并行处理。 总结起来,ParallelStream方法是Java Stream API中的一个方法,它可以让我们以并行的方式对Stream中的元素进行操作。它的具体实现是通过使用ForkJoin框架来调度并行处理任务。使用ParallelStream时需要注意,并不一定所有的操作都会并行执行。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Java8 并行(parallelStream)原理分析及注意事项](https://blog.csdn.net/Clearlove_S7/article/details/130183990)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Java8 并行(parallelStream)原理分析及线程池线数设置](https://blog.csdn.net/qq_42651904/article/details/116357695)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值