1

我们有一个 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出现在任务管理器中
4

2 回答 2

2

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

更多信息在这里

于 2012-11-21T15:33:31.250 回答
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更改了流读取逻辑。现在我不再看到挂起问题了。

于 2018-02-06T05:47:29.187 回答