【发布时间】:2016-05-13 09:04:42
【问题描述】:
为什么下面的代码不打印任何输出,而如果我们删除并行,它会打印 0、1?
IntStream.iterate(0, i -> ( i + 1 ) % 2)
.parallel()
.distinct()
.limit(10)
.forEach(System.out::println);
虽然我知道理想情况下应该将 limit 放在 distinct 之前,但我的问题更多与添加并行处理造成的差异有关。
【问题讨论】:
-
在我的机器上,这会以 100% 的 CPU 使用率锁定 3/4 个内核,而不会产生答案!我认为这可能是limit和parallel交互的一个bug。
-
@Straw1239 - 同意这应该被视为一个错误;这段代码没有立即打印出一些东西,没有明显的原因。
-
它尝试在
distinctop 中缓冲整个流内容。即使没有limit,也会发生这种情况。虽然很明显,处理后续块的线程必须等待它们的前一个流来获得有序流,但第一个不需要等待...... -
@bayou.io:这是一个已知现象,没有看到 OOME,但有一个进程挂在仅执行 GC 活动中。只需监控 JVM 活动、已用内存与最大堆之间的比率以及 CPU 使用率与 GC 活动之间的比率。不过,当 GC 开始发疯时,大多数监控方法也会停止工作……
-
@Straw1239:bayou.io 谈到使用
i->i+1函数而不是i->(i+1)%2。当不使用%2时,缓冲区真的开始耗尽所有内存。
标签: java parallel-processing java-8 java-stream