【问题标题】:Keeping java subprocess alive in background在后台保持 Java 子进程处于活动状态
【发布时间】:2016-03-15 04:17:10
【问题描述】:

我有一个类,它有一个使用流程构建器创建流程的方法。然后,我有 2 个其他方法使用全局变量来编写命令并从进程中收集响应。

我想从另一个类开始该过程,然后能够使用我希望从这个原始类中的其他方法编写命令。但是,我看不到让子流程保持活力的方法。如果我使用.waitFor(),那么我将无法运行任何其他命令,因为它挂起(等待子进程退出)。但是,如果我只是让 create 方法完成,一旦我返回到原始类并调用输入方法,该过程就会被杀死。有没有办法让这个过程保持活跃但睡着了?允许程序继续,但能够回调它。

【问题讨论】:

  • 多线程应该可以解决这个问题。从一个Thread 启动子进程并使用另一个向子进程发送命令
  • 为什么不返回对进程的引用?

标签: java process subprocess builder


【解决方案1】:

您需要在新线程中运行您的子进程。如果您不熟悉多线程和并发处理的概念,请查看这篇文章:http://www.vogella.com/tutorials/JavaConcurrency/article.html

此外,如果您希望子进程在主程序完成后继续存在,则需要将该线程设置为 daemon 线程。

要了解有关线程和守护线程的更多信息,请查看 Java 文档:http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html

【讨论】:

  • 好的,所以我已将 processbuilder 放在第二个线程的 run() 方法中。然后我可以启动线程,但是一旦它完成 run 方法,进程就会被终止,这样我就可以调用类中的其他方法来输入和输出?
  • OK - 对子进程的附加说明我指的是一般的处理,而不是您将使用 ProcessBuilder 创建的重量级(操作系统进程)。在多个线程(又名轻量级线程)中运行“处理”和在不同的操作系统线程中运行进程是有区别的。没有什么能阻止您从新(子)线程创建和启动新进程(使用 PB)。这使您可以继续执行主线程。而子线程(守护进程)将继续运行,直到它启动的进程完成
  • 您遇到的问题是您运行的子进程在您尝试与其“对话”时已经完成。在您的情况下,您正在进行进程间通信,Java 允许的(从使用 ProcessBuilder (PB) 的角度来看)是通过输入/输出流进行通信 - 您需要在开始进程之前进行设置。如果您的主进程(可能在另一个线程中)正在向您的子进程的 Input 发送某些内容,则需要编写子进程以便它等待输入。
  • 好的,所以我实现了一段时间来循环等待输入,但几秒钟后 pb 仍然会杀死系统进程,有什么办法可以阻止它?或者你能解释一下为什么它会关闭它
猜你喜欢
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 2014-08-19
  • 2011-09-07
  • 2013-01-27
  • 2014-06-04
相关资源
最近更新 更多