有没有办法监控执行resp。在Java 8中收集/减少并行Stream? 我想知道,已经处理了多少元素。
在顺序编程中,我可以使用for循环完成整个任务并添加一些计数器,我可以不时地打印到stdout,看看需要多长时间。但是对于并行流,我没有看到任何简单直接的方法来做同样的事情。
答案 0 :(得分:6)
您可以使用peek()
方法观看元素。如果正在并行处理流,则您将从正在处理元素的所有线程中获取这些调用。
那就是说,它可能不是一个聪明的主意。首先,您必须应对线程安全问题;如果你想保持一些全局的计算状态,你必须使用某种同步来保持它的一致性,否则收集的任何统计数据都将毫无意义。并且这种协调会杀死并行性给你的大部分(或者更多)所带来的好处,因为现在你有多个线程一直在争夺一个锁,当时要让这些单独的线程在数据的不相交部分上自由运行。这是一个示例,您希望观察计算将极大地改变其性能特征。
请记住,并行性纯粹是一种优化 - 使用并行性的唯一价值就是更快地得到答案。但是,如果你要像这样将处理器鞋带系在一起,你就不会得到这样的好处。