2010-06-16 74 views
3

經過研究,我發現使用java的ProcessBuilder的「正確」方式是產生兩個其他線程來管理吞噬新創建的進程的stdout/stderr,以便它不會像原樣那樣掛起如下圖所示: javaworld article正確使用ProcessBuilder

但是,這給我留下了疑惑2問題 - 1)爲什麼究竟是單獨的進程所需的而不是父進程吞噬標準輸出,然後依次標準錯誤?

2.)另外,如果您要將流重定向到兩個都轉到標準輸出,只需讓父進程吞下標準輸出流,然後不必擔心死鎖?

回答

3

請注意您的條款。 Threads aren't processes

  1. 因爲孩子可以同時寫入,你會得到一個死鎖時stderr緩衝區滿(孩子等待家長閱讀stderr,家長等待孩子收stdout)。

  2. 號如果子進程還需要stdin,那麼你必須在你的主線程處理stdin,並通過一個額外的線程讀取合併後的輸出流或者你可以再次擁有死鎖(子女等待父母來讀取輸出流並且父母等待孩子讀取stdin上的數據)。