首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行()不使用3-arg迭代()

并行()不使用3-arg迭代()
EN

Stack Overflow用户
提问于 2021-03-23 16:35:10
回答 1查看 90关注 0票数 1

这是我的代码:

代码语言:javascript
复制
int count=20;
Stream.iterate(4,i->i<count,i->i+1).parallel().forEach(i -> {
    try {
        Thread.sleep(new Random().nextInt(2000));
    } catch (InterruptedException ignored) {
    }
    System.out.println(i);
});

我希望这是平行的,但是!当我运行它时,并行()看起来是“死”的,从4到19的数字带有一个“完美”的序列,而这并不是我想要的。所以我对“迭代”部分做了如下修改:

代码语言:javascript
复制
.iterate(4,i->i+1).limit(count-4)

有固定的,并行()再次工作。所以,为什么?迭代限制并行组合看起来太愚蠢了。...Or事实上,可能有什么原因?请帮帮我。太棒了!

ps:我打印线程ID,在第一种情况下,总是打印"main“。在第二种情况下,至少会出现5个线程。

pps:几分钟前,在这个奇怪的问题上,我尝试了2000这个大数字。现在,即使使用几个较大的num(甚至使用Integer.MAX_VALUE)。还在乱糟糟。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-23 22:21:57

很难为包含3个参数的iterate()生成的流构造有意义的分配器。例如,如果您有一个范围从1到1000之间的简单整数流,您可以很容易地将该流分成两个流,一个从1到500,另一个从501到1000,并并行处理它们。但是考虑一下这个例子:

代码语言:javascript
复制
Stream.iterate(4,i->i<Integer.MAX_VALUE,i->i+ThreadLocalRandom.current().nextInteger())

你将如何使这条流平行?第二个线程应该从哪个数字开始?如果不首先计算所有的元素,就无法有效地将这个流分割成各个部分。

当您向流中添加limit()时,实际上是对前一个流的结果进行缓冲,因此limit()可以为它的内部缓冲区提供一个非平凡的分配器。但是,这两个流都不能保证在并行流中做一些特殊的事情,并行()只是一个“推荐”。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66767359

复制
相关文章

相似问题

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