2013-03-08 33 views
1

我使用ProcessBuilder從Java應用程序(主機)啓動新進程(子進程)。事情是這樣的:ProcessBulder加載進程但未啓動它

ProcessBuilder processBuilder = createProcess(commandLine); 
processBuilder.directory(new File(baseDir)); 
processBuilder.redirectErrorStream(true); 
Process process = null; 
try { 
    process = processBuilder.start(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

我看到子進程已經啓動系統監視器,但它不能正常工作,除非我停止主機應用程序。更具體地說,子進程是一個服務器,並且在使用ProcessBuilder啓動它之後,如果主機應用程序仍在運行,則它不響應請求。而且,服務器正在使用的端口仍然可用。如果我停止主機應用程序,服務器立即開始工作。有什麼是我錯過的或者這就是ProcessBuilder假設的工作方式? 非常感謝提前。

+0

的[工藝被暫停,直到我關閉程序]可能的複製(https://stackoverflow.com/questions/44210123/process-is-being-paused-until-i-close -the-program) – msrd0 2017-05-27 12:10:06

回答

2

在大多數情況下,直到進程的標準輸出緩衝區被清空,它不會終止。這可能是因爲你的進程已經填滿了這個緩衝區並且已經停止了(出於某種原因)

嘗試消耗標準進程(通過Process#getInputStream),看看這是否有所作爲。

也可能是該進程正在等待用戶的輸入。

看看I'm not getting any output and probably the machine hangs with the code爲例

+0

Thanks @MadProgrammer!你是對的。當我使用子進程的InputStream時,它開始工作。就像這樣\t ** bold **'process = processBuilder.start(); \t \t \t is = process.getInputStream(); \t \t \t isr = new InputStreamReader(is); \t \t \t br = new BufferedReader(isr); \t \t \t絃線; \t \t \t而(stopProcess!){ \t \t \t \t如果(br.ready()){ \t \t \t \t \t線= br.readLine(); \t \t \t \t \t System.out.println(line); \t \t \t \t} \t \t \t}' – user2149982 2013-03-11 22:25:42

0

@MadProgrammer是正確的。我能夠解決這個問題,我想用一個代碼示例回答我的問題。這對其他人也可能有用。 您需要在啓動子進程後使用該標準。是這樣的:

 process = processBuilder.start(); 
     InputStream is = process.getInputStream(); 
     INputStreamReadr isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line; 
     while (!stopProcess) { 
      if (br.ready()) { 
       line = br.readLine(); 
       System.out.println(line); 
      } 
     } 
相關問題