这可能是非常基本的,但我不是 Java 人。这是我的处理代码,它只是打印和 hibernate :
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)
最佳答案
一种方法是估计流的大小:
Spliterators.spliterator(it, 3, 0);
数字(此处为 3)不必精确,但如果您说 10000,则实际大小为 3 时只会使用一个线程。如果您说的是 10,则将使用多个线程,即使有大小共 3 个。估计值(在我的示例中为 3)用于确定批次的大小(在转移到下一个线程之前发送到一个线程的任务数)。如果你提供了一个很大的估计数量并且只提交了几个任务,它们可能会全部被分组并在第一个线程上运行,而不会向第二个线程发送任何内容。
关于java - 为什么用 Spliterators 创建的流没有被并行处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62653471/