猿问

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

从 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);

       }

   }


白衣染霜花
浏览 126回答 1
1回答

侃侃无极

问题不清楚,似乎陈述了不真实的事实。流永无止境当进程终止并且所有输出都已被读取时,流将结束。既然那永远不会发生,你是对的,流永远不会结束。为什么这个程序没有结束?相反,它会继续打印“正在运行”。因为该过程永远不会结束,并且会永远循环地打印“Running” while (true) {...}。这就是你编写代码要做的事情,所以这就是它的作用。为什么程序完全按照您的指示执行操作,这让您感到困惑?异步调用消费者不,这是同步完成的,除非你使它并行。JVM有一个线程在后台调用lines().forEach()方法不,这是在主线程中完成的,除非您将其设为并行,但您没有这样做。
随时随地看视频慕课网APP

相关分类

Java
我要回答