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-).
| 归档时间: |
|
| 查看次数: |
1083 次 |
| 最近记录: |