为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白衣染霜花 2023-06-28 16:19:28
从 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()方法

不,这是在主线程中完成的,除非您将其设为并行,但您没有这样做。


查看完整回答
反对 回复 2023-06-28
  • 1 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信