Stream.parallel()是否使用新线程?

FRR*_*FRR 5 java multithreading java-8 java-stream

所以,我试图了解Java 8中引入的Stream API.我正在尝试创建一个可以在单独的线程上运行的流(仅用于教育目的)

String oracle = "http://www.oracle.com";
URL url = new URL(oracle);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
in.lines().parallel().forEach(System.out::println);
System.out.print("CLOSING THE INPUT STREAM!, shouldnt this crash?");
in.close();
Run Code Online (Sandbox Code Playgroud)

结果不是我所期望的......(我原本期待崩溃,因为我关闭了输入流,而另一个线程正在读取它).注意.parallel()方法调用.相反,代码似乎以顺序方式执行而没有任何问题.

OUTPUT:

<script language="JavaScript" src="http://www.oracleimg.com/us/assets/metrics/ora_ocom_hp.js"></script>
<!-- End SiteCatalyst code --> 

            <!-- SS_END_SNIPPET(fragment6,1)-->
<!-- SS_BEGIN_SNIPPET(fragment7,ui)-->          <!-- SS_END_SNIPPET(fragment7,ui)-->
</html>
CLOSING THE INPUT STREAM!, shouldnt this crash?
Run Code Online (Sandbox Code Playgroud)

有谁知道发生了什么?为什么我的代码没有崩溃?

man*_*uti 13

并行流确实会尝试将读取行的工作分成多个线程.但是调用本身就是阻塞,即语句等待所有线程完成以继续下一个语句(关闭输入流).

需要注意的一点是,forEach并不能保证并行操作的执行顺序与流元素的顺序相同,因此在这种情况下,打印的行与原始Web页面的顺序可能不同(请参阅https:// docs. oracle.com/javase/8/docs/api/java/util/stream/Stream.html#forEach-java.util.function.Consumer-).

  • @feresr:关键在于,如果它产生(比方说)十个线程并行完成工作,那么整个操作的速度可能比仅用一个执行速度快十倍.(实际上它可能不会那么快 - 或者由于缓存效应可能会更快 - 但不管怎样,这就是想法!) (2认同)
  • 使用并行流,执行可能更快.您可以尝试测量顺序流的差异.它仍然需要阻塞,因为`forEach`是一个_terminal操作_需要结合一定的结果.你也可以调用`sum`操作,在这种情况下它必须等待结果的组合. (2认同)