2012-11-21 60 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更改了流读取逻辑。现在我不再看到悬挂问题了。