从另一个java进程启动java进程时进程挂起

时间:2012-11-21 15:31:25

标签: java jvm hang

我们有一个32位进程A,它必须启动另一个必须在64位进程中运行的java jar。他们通过套接字进行通信。这个系统工作正常。

但在极少数情况下,我们会看到第二个进程(B)挂起,直到我们关闭启动它的进程(A)。当我调试这个问题时,我想读取进程B的输入流以查看正在输出的消息,并且看到从进程B的输入流中读取解决了该问题。所以我们跨越了一个愚蠢的线程,它只读取进程B的输入流,一切正常。

问题非常奇怪,但我们不得不继续前进。我们认为它与控制台输出缓冲区大小或类似的东西有关。但我们已经看到这个问题出现在新安装的机器上,尽管我们读取了启动过程的输入流(B)。

尽管这种情况非常罕见,但我们仍然非常确定为什么会发生这种情况。可能是什么原因?是否有我们不知道的默认设置?你以前遇到过这种情况吗?

快速摘要:

  • 进程A以32位进程运行
  • 进程B以64位进程运行
  • 进程A通过指向64位javaw.exe
  • 发出Runtime.exec来启动进程B.
  • 进程B挂起,直到我们关闭进程A
  • 我们看到流程B出现在任务管理器中

2 个答案:

答案 0 :(得分:2)

您需要从生成的进程中同时使用stadout和stderr,并且需要同时执行 ,否则生成的进程可能会阻止等待父进程使用该输出。

更多信息here

答案 1 :(得分:0)

我有进程挂起问题。对我来说,我想从产生的子进程中获取stdout和stderr日志。由于使用了read blocking call' 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更改了流读取逻辑。现在我不再看到挂起问题了。