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

标签 java parallel-processing java-stream spliterator

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

相关文章:

java - 如何从条目流中生成 map ?

java - 如何使用 Java 中的流将没有泛型的列表转换为带有泛型的列表?

java - 如何在 Main 方法中声明静态变量?

java - 现在有人为 Spring 框架使用 Java-config 吗?

java - 如何使用Java将用户提供的图片保存到数据库

c++ - 对于 ~95% 写入/5% 读取线程安全的 unordered_map 是否有简单的解决方案?

parallel-processing - MPI:主从模式,主控也在工作

java - 嵌套对象空字段的 Spring 表单绑定(bind)问题

r - 如何在Windows上的R中并行化-示例?

java - 如何使用 lambda 从列表中找到最大数字及其出现次数?