從 BufferedReader 獲取數(shù)據(jù)的流似乎是異步調(diào)用消費者,這是一個很棒的功能。為什么是這樣?看來 JVM 有一個線程在后臺調(diào)用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條經(jīng)驗 獲得超10個贊
問題不清楚,似乎陳述了不真實的事實。
流永無止境
當(dāng)進程終止并且所有輸出都已被讀取時,流將結(jié)束。既然那永遠不會發(fā)生,你是對的,流永遠不會結(jié)束。
為什么這個程序沒有結(jié)束?相反,它會繼續(xù)打印“正在運行”。
因為該過程永遠不會結(jié)束,并且會永遠循環(huán)地打印“Running” while (true) {...}
。這就是你編寫代碼要做的事情,所以這就是它的作用。為什么程序完全按照您的指示執(zhí)行操作,這讓您感到困惑?
異步調(diào)用消費者
不,這是同步完成的,除非你使它并行。
JVM有一個線程在后臺調(diào)用lines().forEach()方法
不,這是在主線程中完成的,除非您將其設(shè)為并行,但您沒有這樣做。
添加回答
舉報
0/150
提交
取消