Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java parallel()不能与3-arg iterate()一起使用_Java_Java Stream - Fatal编程技术网

Java parallel()不能与3-arg iterate()一起使用

Java parallel()不能与3-arg iterate()一起使用,java,java-stream,Java,Java Stream,这是我的密码: 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); }); 修复后,parall

这是我的密码:

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);
});

修复后,parallel()再次工作。 那么,为什么???迭代限制并行组合似乎太傻了。 …或者事实上,可能有原因? 请帮帮我。 谢谢

ps:我打印线程ID,在第一种情况下,总是打印“main”。在第二种情况下,至少显示5个线程


pps:在几分钟前的这个奇怪的会议上,我尝试了2000作为一个大数字。现在,即使有几个更大的num(即使使用Integer.MAX_值)。仍然有问题。

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

Stream.iterate(4,i->ii+ThreadLocalRandom.current().nextInteger())
你如何使这条河平行?第二个线程应该从哪个数字开始?如果不先计算流的所有元素,就无法有效地将流拆分为多个部分


将limit()添加到流中时,实际上会缓冲上一个流的结果,因此limit()可以为其内部缓冲区提供一个非常重要的拆分器。然而,这两个流都不能保证在并行流中做特殊的事情,parallel()只是一个“建议”。

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

Stream.iterate(4,i->ii+ThreadLocalRandom.current().nextInteger())
你如何使这条河平行?第二个线程应该从哪个数字开始?如果不先计算流的所有元素,就无法有效地将流拆分为多个部分


将limit()添加到流中时,实际上会缓冲上一个流的结果,因此limit()可以为其内部缓冲区提供一个非常重要的拆分器。但是,这两个流都不能保证在并行流中执行特殊操作,parallel()只是一个“建议”。

您是否尝试打印线程ID以及
i
的值以查看实际发生的情况?是的,我打印线程ID,在第一种情况下,总是打印“main”。在第二种情况下,至少显示了5个线程。为什么不在原始帖子中包含这些信息?看起来很重要,不是吗?我不能用更大的数字重现你描述的行为。当使用大于1024+4的计数时,我得到并行处理@AniketSahrawat虽然我不能重现“没有并行处理”的行为,但我发现并行处理令人惊讶地有限,例如与
Stream.iterate(4,I->I+1).takeWhile相比(i->iDid您是否尝试打印线程ID以及
i
的值以查看实际发生的情况?是的,我打印线程ID,在第一种情况下,始终打印“main”。在第二种情况下,至少显示了5个线程。为什么不在原始帖子中包含这些信息?似乎很重要,不是吗?我无法复制您描述的较大数字的行为。当使用大于1024+4的计数时,我得到并行处理。@AniketSahrawat,而我无法复制“无并行处理”行为,我发现并行处理的局限性令人惊讶,例如,与
Stream.iterate(4,I->I+1)相比。takeWhile(I->ireal谢谢!这一点解决了我的“为什么”记住这个问题!对这样的流有并行支持,但它依赖于缓冲元素,默认情况下,在将它们传递给另一个线程之前,至少要缓冲1024个元素。同样,当元素的数量超过这个数量时,会有并行处理。但是在这个例子中,迭代逻辑很便宜,并且终端操作n费用,这是无法解释的为什么没有更好的效益。事实上,使用语义等价的
Stream.iterate(4,i->i+1).takeWhile(i->ireal谢谢!这个点击并解决了我的“为什么”记住这个问题!对这样的流有并行支持,但它依赖于缓冲元素,默认情况下,在将它们传递给另一个线程之前,至少要缓冲1024个元素。同样,当元素的数量超过这个数量时,会有并行处理。但是在这个例子中,迭代逻辑很便宜,并且终端操作事实上,使用语义等价的
Stream.iterate(4,i->i+1).takeWhile(i->i
.iterate(4,i->i+1).limit(count-4)