首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么用Spliterator创建的流不是并行处理的?

为什么用Spliterator创建的流不是并行处理的?
EN

Stack Overflow用户
提问于 2020-06-30 08:38:43
回答 2查看 661关注 0票数 5

这可能是非常基本的,但我不是Java人。下面是我的处理代码,它只是打印和休眠:

代码语言:javascript
复制
    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);
    }

现在,这个并行流似乎是并行工作的:

代码语言:javascript
复制
    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

但这一件(由一位爱尔兰人制作)并没有:

代码语言:javascript
复制
    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)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-30 10:06:52

一种方法是估算出溪流的大小:

代码语言:javascript
复制
Spliterators.spliterator(it, 3, 0);

这个数字(这里的3 )不一定精确,但是如果你给出10000,那么实际大小为3时,只会使用一个线程。如果你给出10,就会使用多个线程,即使大小为3。

估计值(在我的示例中为3)用于确定批的大小(在转移到下一个线程之前发送到一个线程的任务数量)。如果您提供了大量的估计数,并且只提交了几个任务,那么它们很可能都会在第一个线程上被分组并运行,而没有任何任务会被发送到第二个线程。

票数 5
EN

Stack Overflow用户

发布于 2022-04-22 08:23:56

Spliterators.spliteratorUnknownSize()实现中存在一个缺陷。我用Java 19修复了它,参见JDK-8280915。由于19-ea+19-1283早期访问构建问题不再重现,您的代码在没有显式大小规范的情况下被正确并行化:

代码语言:javascript
复制
Processing 2
Processing 3
Processing 1
Finished processing 3
Finished processing 1
Finished processing 2
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62653471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档