这可能是非常基本的,但我不是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我在定制的Iterator版本中做错了什么?(我正在使用Java 8)
发布于 2020-06-30 10:06:52
一种方法是估算出溪流的大小:
Spliterators.spliterator(it, 3, 0);这个数字(这里的3 )不一定精确,但是如果你给出10000,那么实际大小为3时,只会使用一个线程。如果你给出10,就会使用多个线程,即使大小为3。
估计值(在我的示例中为3)用于确定批的大小(在转移到下一个线程之前发送到一个线程的任务数量)。如果您提供了大量的估计数,并且只提交了几个任务,那么它们很可能都会在第一个线程上被分组并运行,而没有任何任务会被发送到第二个线程。
发布于 2022-04-22 08:23:56
Spliterators.spliteratorUnknownSize()实现中存在一个缺陷。我用Java 19修复了它,参见JDK-8280915。由于19-ea+19-1283早期访问构建问题不再重现,您的代码在没有显式大小规范的情况下被正确并行化:
Processing 2
Processing 3
Processing 1
Finished processing 3
Finished processing 1
Finished processing 2https://stackoverflow.com/questions/62653471
复制相似问题