这是我的代码:
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的数字带有一个“完美”的序列,而这并不是我想要的。所以我对“迭代”部分做了如下修改:
.iterate(4,i->i+1).limit(count-4)有固定的,并行()再次工作。所以,为什么?迭代限制并行组合看起来太愚蠢了。...Or事实上,可能有什么原因?请帮帮我。太棒了!
ps:我打印线程ID,在第一种情况下,总是打印"main“。在第二种情况下,至少会出现5个线程。
pps:几分钟前,在这个奇怪的问题上,我尝试了2000这个大数字。现在,即使使用几个较大的num(甚至使用Integer.MAX_VALUE)。还在乱糟糟。
发布于 2021-03-23 22:21:57
很难为包含3个参数的iterate()生成的流构造有意义的分配器。例如,如果您有一个范围从1到1000之间的简单整数流,您可以很容易地将该流分成两个流,一个从1到500,另一个从501到1000,并并行处理它们。但是考虑一下这个例子:
Stream.iterate(4,i->i<Integer.MAX_VALUE,i->i+ThreadLocalRandom.current().nextInteger())你将如何使这条流平行?第二个线程应该从哪个数字开始?如果不首先计算所有的元素,就无法有效地将这个流分割成各个部分。
当您向流中添加limit()时,实际上是对前一个流的结果进行缓冲,因此limit()可以为它的内部缓冲区提供一个非平凡的分配器。但是,这两个流都不能保证在并行流中做一些特殊的事情,并行()只是一个“推荐”。
https://stackoverflow.com/questions/66767359
复制相似问题