首页 / JAVA / 在并行Java流中处理随机数
在并行Java流中处理随机数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在并行Java流中处理随机数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1845字,纯文字阅读大概需要3分钟。
内容图文
![在并行Java流中处理随机数](/upload/InfoBanner/zyjiaocheng/819/feb5960177064e8cac68ca79ef63c2d3.jpg)
我想从0到50范围内生成5个不同的随机数,然后并行地对它们执行一些操作.当我写这个程序时,程序永远不会结束:
new Random().ints(0, 50)
.distinct()
.limit(5)
.parallel()
.forEach(d -> System.out.println("s: " + d));
我试图使用peek调试它.我有无限数量的c:行,50 d:行,但是零l:或s:行:
new Random().ints(0, 50)
.peek(d -> System.out.println("c: " + d))
.distinct()
.peek(d -> System.out.println("d: " + d))
.limit(5)
.peek(d -> System.out.println("l: " + d))
.parallel()
.forEach(d -> System.out.println("s: " + d));
我的实施有什么问题?
解决方法:
首先,请注意.parallel()会更改整个管道的并行状态,因此它会影响所有操作,而不仅仅是后续操作.在你的情况下
new Random().ints(0, 50)
.distinct()
.limit(5)
.parallel()
.forEach(d -> System.out.println("s: " + d));
是相同的
new Random().ints(0, 50)
.parallel()
.distinct()
.limit(5)
.forEach(d -> System.out.println("s: " + d));
您不能仅并行化部分管道.它是平行还是不平行.
现在回到你的问题.由于Random.ints是无序流,因此选择了distinct和limit的无序实现,因此它不是this question的重复(其中问题在于有序的不同实现).这里的问题在于无序的limit()实现.为了减少可能的争用,它不检查在不同线程中找到的元素的总数,直到每个子任务获得至少128个元素或上游耗尽(参见implementation,1 << 7 = 128).在你的情况下,上游distinct()发现只有50个不同的元素,拼命遍历输入,希望找到更多,但下游limit()不发信号停止处理,因为它想要在检查之前是否收集至少128个元素达到限制(由于限制小于128,因此不是很聪明).所以要使这个东西工作,你应该至少选择(128 *个CPU数量)不同的元素.在我的4核机器上使用新的Random().ints(0,512)成功,而新的Random().ints(0,511)卡住了. 为了解决这个问题,我建议按顺序收集随机数并在那里创建一个新流:
int[] ints = new Random().ints(0, 50).distinct().limit(5).toArray();
Arrays.stream(ints).parallel()
.forEach(d -> System.out.println("s: " + d));
我假设你想要执行一些昂贵的下游处理.在这种情况下,并行生成5个随机数并不是很有用.顺序执行时,此部分将更快.
更新:提交了bug report并提交了patch.
内容总结
以上是互联网集市为您收集整理的在并行Java流中处理随机数全部内容,希望文章能够帮你解决在并行Java流中处理随机数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。