从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);
}
}
答案 0 :(得分:4)
问题尚不清楚,并且似乎陈述了不正确的事实。
流永无止境
当进程终止并且所有输出都已读取时,流将结束。既然那永远不会发生,那么您是对的,流永远不会结束。
为什么该程序没有结束?而是继续打印“正在运行”。
因为该过程永无止境,并始终在while (true) {...}
永久循环中打印“正在运行”。那就是您编写的代码要做的,这就是它的工作。为什么让您感到困惑,该程序确实按照您的指示进行操作?
异步调用消费者
不,这是同步完成的,除非您将其设置为 parallel 。
JVM有一个线程在后台调用lines()。forEach()方法
不,这是在主线程中完成的,除非您将其设置为 parallel ,否则您不会这样做。