【发布时间】:2013-12-17 16:57:21
【问题描述】:
我的以下代码无法按预期工作(跳过了随机行,而不是第一行):
Files.lines(path)
.skip(1)
.parallel()
.forEach( System.out::println )
我感觉我误解了 Streams 的行为。问题是:我可以先将流视为顺序流(并使用“有状态的中间操作”),然后将其输入并行forEach?
【问题讨论】:
-
你在做线性运算,为什么要用
.parallel()? -
@Esko 显然,“println”是处理器密集型操作的替代品,我根据文件中的条目执行此操作。
-
sheitt [尴尬] 我的运行时没有并行执行它们......!
-
原来我的 jUnit 测试没有并行执行(不知道为什么??)但非测试可以。完全把我弄糊涂了!无论如何,skip 的行为似乎是非常不可预测的,有时它是最后一个被跳过的项目。甚至 parallel() 也很不稳定......有时只有在迭代次数很高并且列表中的项目数很高时才会创建线程。对于慢速作业(需要大量计算),它没有创建任何线程。对于 1000 多个短作业(需要几毫秒的时间),它确实是并行执行的。测试看看。
-
看Javadoc,我想你想要的是
forEachOrdered。然后跳过将正常工作并且流将是并行的。但是,您仍然必须忍受一个非常不可预测和无法控制的线程生成公式。最好自己动手。除非,就像我尝试过的那样,你有许多短暂的任务,那么它似乎可以工作。
标签: java java-8 java-stream