从 BufferedReader 获取数据的流似乎是异步调用消费者,这是一个很棒的功能。为什么是这样?看来 JVM 有一个线程在后台调用lines().forEach()方法。 public class P { public static void main(String[] args) throws InterruptedException { while (true) { Thread.sleep(1000); java.lang.System.out.println("Running"); } } } class StreamQuestion { public static void main(String[] args) throws java.io.IOException { ProcessBuilder pb = new ProcessBuilder().command("java", "P"); pb.environment().put("CLASSPATH", P.class.getProtectionDomain().getCodeSource().getLocation().getPath()); java.lang.Process p = pb.start(); /** * Question: Why does this program not end? Instead, it keeps printing "Running". * */ new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream())).lines().forEach(java.lang.System.out::println); } }
1 回答
侃侃无极
TA贡献2051条经验 获得超10个赞
问题不清楚,似乎陈述了不真实的事实。
流永无止境
当进程终止并且所有输出都已被读取时,流将结束。既然那永远不会发生,你是对的,流永远不会结束。
为什么这个程序没有结束?相反,它会继续打印“正在运行”。
因为该过程永远不会结束,并且会永远循环地打印“Running” while (true) {...}
。这就是你编写代码要做的事情,所以这就是它的作用。为什么程序完全按照您的指示执行操作,这让您感到困惑?
异步调用消费者
不,这是同步完成的,除非你使它并行。
JVM有一个线程在后台调用lines().forEach()方法
不,这是在主线程中完成的,除非您将其设为并行,但您没有这样做。
添加回答
举报
0/150
提交
取消