栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

来自HashSet的并行流不会并行运行

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

来自HashSet的并行流不会并行运行

我可以重现您看到的行为,其中并行性与您指定的fork-join池并行性的并行性不匹配。将fork-
join池的并行度设置为10,并将集合中的元素数增加到50后,我看到基于列表的流的并行度仅上升到6,而基于集合的流的并行度从未超过2。

但是请注意,这种将任务提交给fork-join池以在该池中运行并行流的技术是一种“技巧”,并且 不能保证 能正常工作。实际上, 未指定
用于执行并行流的线程或线程池。默认情况下,使用公共的fork-join池,但是在不同的环境中,最终可能会使用不同的线程池。(请考虑应用程序服务器内的容器。)

在java.util.stream.AbstractTask类中,该

LEAF_TARGET
字段确定完成的拆分数量,而拆分又确定了可以实现的并行数量。该字段的值基于
ForkJoinPool.getCommonPoolParallelism()
哪个当然使用了公共池的并行性,而不取决于运行任务的任何池。

可以说这是一个错误(请参阅OpenJDK问题JDK-8190974),但是,整个区域都未指定。但是,系统的这一领域肯定需要发展,例如在拆分策略,可用并行性,处理阻塞任务等方面。JDK的未来版本可能会解决其中一些问题。

同时,可以通过使用系统属性来控制公共fork-join池的并行性。如果将此行添加到程序中,

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

并且您在公共池中运行流(或者,如果将它们提交到具有足够高的并行性集的自己的池中),您会发现有更多的任务并行运行。

您也可以使用

-D
选项在命令行上设置此属性。

同样,这不是保证的行为,将来可能会改变。但是在可预见的将来,该技术可能会对JDK 8实现有效。

更新2019-06-12:
JDK-8190974
错误已在JDK
10中修复,并且该修复已向后移植到即将发布的JDK 8u版本(8u222)中。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/449787.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号