2013-03-08 52 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); 
      } 
     } 
相关问题