gpt4 book ai didi

java - 为什么用 Spliterators 创建的流没有被并行处理?

转载 作者:行者123 更新时间:2023-12-01 12:47:48 25 4
gpt4 key购买 nike

这可能是非常基本的,但我不是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com