2013-06-04 35 views
1

我一直試圖在谷歌中搜索很長一段時間,但沒有取得任何成功。我希望在這裏解決我的問題。
第一功能:Java進程在進程中間停止

public void startTFServer(Channel c) { 
    try { 
     ProcessBuilder procBuilder = new ProcessBuilder("tfs.exe"); 
     procBuilder.redirectErrorStream(); 
     Process proc = null; 
     System.out.println(Runtime.getRuntime().freeMemory()); 
     proc = procBuilder.start(); 
     System.out.println(Runtime.getRuntime().freeMemory()); 
     StreamGobbler gobbler = new StreamGobbler(proc.getInputStream(), "STD_OUT"); 
     gobbler.start(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

捕獲過程輸出的線程:

private class StreamGobbler extends Thread { 
    InputStream is; 
    String type; 

    private StreamGobbler(InputStream is, String type) { 
     this.is = is; 
     this.type = type; 
    } 

    @Override 
    public void run() { 
     try { 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String line = null; 
      while ((line = br.readLine()) != null) {    
       System.out.println(type + "> " + line); 
      } 
     } 
     catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
    } 
} 

問題: 當運行輸入中斷在同一個地方的每個應用程序時間。我使用「Process class」運行的應用程序是需要相當一些內存才能運行的服務器,難道這是導致進程無法完成加載我的應用程序的原因之一嗎?我在想內存會耗盡,但我無法真正診斷它。

任何幫助將不勝感激!

+0

當你說「中斷」,你是什麼意思是什麼呢?你遇到異常,還是隻是掛起? –

+0

它在哪裏呢?你說它每次都發生在同一個地方 - 哪一行似乎是負責任的? –

+0

中斷髮生在加載某個類型的怪物(正在執行的服務器進程)之後。它只停留在那條線上,而沒有進一步發展。沒有例外(即使在ErrorOutputStream中也沒有)。 (當我在桌面上自己執行它時,應用程序運行得很好,但是當包裝在Java Process類中時,它似乎內存不足,至少這是我認爲的情況) –

回答

1

還有,我注意到一個問題:

procBuilder.redirectErrorStream(); 

這不是你想要的。這是一個getter方法,告訴你redirectErrorStream屬性的值是什麼。它可能是你有錯誤,你被阻止,因爲他們沒有閱讀。因此,你需要使用的setter方法:請參閱API redirectErrorStream(boolean)

procBuilder.redirectErrorStream(true); 
+0

哇,我多麼愚蠢......它的工作原理!萬分感謝! =) –

+0

非常歡迎:)。但我認爲這個方法的名稱是誤導性的,而不是遵循這些慣例。如果它被命名爲isRedirectErrorStream()或getRedirectErrorStream(),它會更清晰。 –

+0

我同意!我不知道這是一個「吸氣劑」,你會認爲這將做名稱所說的,以及我錯了:(令人驚訝的是,有很棒的人在那裏可以幫助你解決這個問題,例如在一小時內後,我印象深刻!:) –

1

如果我錯了,我很抱歉,但我認爲你正在耗盡來自外部過程的輸出,而不是等到它完成才能繼續閱讀。我的意思是,基本上:

while ((line = br.readLine()) != null) {    
    System.out.println(type + "> " + line); 
} 

如果進程停止向輸出寫入一秒鐘,記錄器將停止記錄。如果它再次開始寫入,您將不在循環中。

+0

感謝您的輸入!可悲的是,它似乎不是原因... 似乎永遠停在這裏: STD_OUT> [菌種:: addMonster]找不到Waspoid STD_OUT> [菌種:: addMonster]找不到履帶 STD_OUT> [菌種:: addMonster]找不到履帶 STD_OUT> [ Spawn :: addMonster]找不到Crawler STD_OUT> [Spawn :: addMonster]找不到Crawler STD_OUT> [Spawn :: addMonster]無法找到Boozer 雖然有很多更多的輸入。 –

+0

我認爲他是對的 - 試着在那個循環內睡一秒左右,讓輸入累積。可能不是一個長期的解決方案,但它應該確認診斷。 –

+1

我不認爲這是真的,因爲readline會阻塞,直到有更多的數據。只有當輸入終止時,他纔會收到null。看到以下並檢查排名最高的答案http://stackoverflow.com/questions/2776724/java-bufferedreader-readline-blocking –