为什么BufferedReader lines()方法(一个流)永远不会结束?

时间:2019-08-29 16:56:26

标签: java java-8 stream

从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 个答案:

答案 0 :(得分:4)

问题尚不清楚,并且似乎陈述了不正确的事实。

  

流永无止境

当进程终止并且所有输出都已读取时,流将结束。既然那永远不会发生,那么您是对的,流永远不会结束。

  

为什么该程序没有结束?而是继续打印“正在运行”。

因为该过程永无止境,并始终在while (true) {...}永久循环中打印“正在运行”。那就是您编写的代码要做的,这就是它的工作。为什么让您感到困惑,该程序确实按照您的指示进行操作?

  

异步调用消费者

不,这是同步完成的,除非您将其设置为 parallel

  

JVM有一个线程在后台调用lines()。forEach()方法

不,这是在主线程中完成的,除非您将其设置为 parallel ,否则您不会这样做。