【发布时间】:2020-10-20 12:31:50
【问题描述】:
这可能是非常基本的,但我不是 Java 人。这是我的处理代码,它只是打印和休眠:
private static void myProcessings(int value)
{
System.out.println("Processing " + value);
try
{
Thread.sleep(2000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("Finished processing " + value);
}
现在,这个并行流似乎可以并行工作:
IntStream iit = IntStream.rangeClosed(1,3);
iit.parallel().forEach(Main::myProcessings);
// output:
// Processing 2
// Processing 1
// Processing 3
// Finished processing 3
// Finished processing 2
// Finished processing 1
但是这个(由迭代器制成)没有:
static class MyIter implements Iterator<Integer>
{
private int max;
private int current;
public MyIter(int maxVal)
{
max = maxVal;
current = 1;
}
@Override
public boolean hasNext()
{
return current <= max;
}
@Override
public Integer next()
{
return current++;
}
}
MyIter it = new MyIter(3);
StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, 0), true)
.forEach(Main::myProcessings);
// output:
// Processing 1
// Finished processing 1
// Processing 2
// Finished processing 2
// Processing 3
// Finished processing 3
我在自定义迭代器版本中做错了什么? (我使用的是 Java 8)
【问题讨论】:
-
你有
parallel()在一个但没有在另一个? -
@akuzminykh 后面的我也用过
.parallel(),没用。因为StreamSupport.stream()中的第二个参数已经使其并行。 -
@akuzminykh
stream(Spliterators.spliteratorUnknownSize(it, 0), true)- 第二个参数 -true是结果流是否必须并行的标志。 -
相关且可能重复的stackoverflow.com/questions/46709455/…,它提到
true参数不会使流parallel -
stackoverflow.com/a/48308511/4949750 - 检查这个答案 - 它准确地解释了这里的问题。 Spliterators 将仅使用足够大的集合(例如 10000 多个元素)来拆分工作。如果您减少睡眠时间并增加元素数量,您的代码就可以正常工作。
标签: java parallel-processing java-stream spliterator