java - 流程卡在流程构建器上

标签 java multithreading jvm deadlock

我正在开发java进程构建器来执行Windows外部进程(即exe文件)。我必须使用输入流、错误流来获取进程信息和错误,并将其写入一些文本文件中。

它有时工作,有时意外挂起。

当我调用大约三个外部进程来一一执行时。两个进程正在工作,并且仅在第三个进程上挂起。

我可以看到进程退出值有时为 0,它给出了一些其他随机值。

我已阅读以下博客并应用相同的逻辑来执行该流程,但不适用于我的场景。

有人可以帮我诊断这些问题吗...

//开始发起外部进程 //此代码将从中选择三个参数来顺序执行该过程 //它将把进程命令一一传递给for循环

 Process p =new ProcessBuilder(s)
               .directory(new File(je.getExecution().getWorkingDirectory()))
               .redirectErrorStream(true)
               .redirectOutput(file)
               .start();

p.getOutputStream().close();
int processStatus= p.waitFor();

//如果进程以0正常终止退出

提前致谢..,

最佳答案

您所做的整个事情很容易出错,并且不值得尝试找出所有错误,因为您正在让自己的生活变得不必要的困难。

请注意,您正在调用 redirectErrorStream(true),但仍在尝试从错误流中读取,这是没有意义的。在这种情况下,错误流将始终为空。也就是说,如果您已经了解重定向,则不清楚为什么不直接使用它们,而是创建线程、手动将数据复制到 StringWriter 等。

显然,您想要使用工作目录je.getExecution().getWorkingDirectory(),启动命令s并指导输出和错误程序到文件。这可以很容易地实现

new ProcessBuilder(s)
    .directory(je.getExecution().getWorkingDirectory())
    .redirectErrorStream(true).redirectOutput(file)
    .start()
    .waitFor();

唯一剩下的错误源是启动的进程可能会等待您这边的输入。由于您显然不想提供输入,因此可以使用

Process proc = new ProcessBuilder(s)
    .directory(je.getExecution().getWorkingDirectory())
    .redirectErrorStream(true).redirectOutput(file)
    .start();
proc.getOutputStream().close();
proc.waitFor();

表示您不会写入任何数据。这不会停止进程,但是当它尝试从标准输入读取某些内容时,它将立即获得文件结尾而不会阻塞。

可以通过以下方式进行演示

Process proc = new ProcessBuilder("cmd", "/c", "pause")
    .redirectErrorStream(true).redirectOutput(file)
    .start();
proc.getOutputStream().close();
proc.waitFor();

关于java - 流程卡在流程构建器上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42436307/

相关文章:

java - 如何比较两个以上的字符串?

java - POSTed JSON 中的实体关系与 Spring Boot

Java - 常量可以在其中存储和计算其他变量吗?

java - 多个 java 实例 -Xms -Xmx

java - 如何开始使用 Java 模块?

java - 将 List<String> 直接转换为 List<Integer>

javascript - WPF WebBrowser 甚至在使用 ObjectForScripting 的单独线程上锁定 UI

java - 尝试并行运行 2 个 AsyncTasks,但它们似乎相互阻塞

node.js - Node 集群: Handle task only to one worker

Tomcat 7 添加Web 应用程序后自动崩溃