2012-11-21 61 views
1

我們有一個32位進程A,它必須啓動另一個必須以64位進程運行的java jar。他們通過套接字進行通信。這個系統工作正常。從另一個java進程啓動java進程時進程掛起

但是在一些罕見的情況下,我們看到第二個過程(B)掛起,直到我們關閉啓動它的過程(A)。在我調試這個問題時,我想讀取進程B的輸入流以查看正在輸出什麼消息,並且看到從進程B的輸入流讀取的內容解決了問題。所以我們跨越了一個愚蠢的線程,只讀取進程B的輸入流,一切正常。

這個問題很奇怪,但我們不得不繼續前進。我們認爲它與控制檯輸出緩衝區大小或類似的東西有關。但是我們已經看到這個問題出現在新安裝的機器上,儘管我們讀取了啓動過程的輸入流(B)。

儘管發生的情況非常罕見,但我們希望能夠絕對確定發生這種情況的原因。可能是什麼原因?有沒有我們不知道的默認設置?你以前遇到過這種情況嗎?

快速摘要:

  • 過程A運行在32位過程
  • 處理B在一個64位的進程中運行
  • 處理A通過通過指向發出的Runtime.exec開始處理B 64位的javaw.exe
  • 進程B掛起,直到我們關閉進程A
  • 我們看到進程B出現在任務管理器

回答

2

您需要消耗產生的進程中的stadout和stderr,並且您需要同時執行,否則生成的進程可能會阻止等待父進程使用該輸出。

更多信息here

+0

我在問這個問題之前看過這篇文章,但想確定它是否是唯一可能的原因。從錯誤流中讀取是我們案例中唯一缺失的部分。 – idursun

0

我有進程掛起問題。對我而言,我希望生成的子進程的stdout和stderr日誌。生成的子進程由於使用來自父進程的讀取阻塞調用'readLine()'而變得掛起。以下代碼對我造成了問題。

BufferedReader processInputReader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
     while ((line = processInputReader.readLine()) != null){ 
      bw.write(line+"\n"); //write to temp file 
     } 
     processInputReader.close(); 

     //get error stream 
     processInputReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
     while ((line = processInputReader.readLine()) != null){ 
      bw.write(line+"\n"); //write to temp file 
     } 
     processInputReader.close(); 

我參照https://ostermiller.org/utils/src/ExecHelper.java.html更改了流讀取邏輯。現在我不再看到懸掛問題了。