我希望能够从 JVM 内部启动一个外部进程并完成它。
我可以使用 ProcessBuilder 创建一个 Process,然后执行 Process.waitFor() 以等待其完成。但是,这是一个阻塞调用,只会浪费线程资源。
通过事件处理程序和反应式编程来做到这一点会更有意义。有人会认为 JVM 可以向操作系统注册某种侦听器来侦听进程完成事件,并将其转发回程序。
是否存在这样的机制/ API?实现这一目标的任何替代方案或库?
我希望能够从 JVM 内部启动一个外部进程并完成它。
我可以使用 ProcessBuilder 创建一个 Process,然后执行 Process.waitFor() 以等待其完成。但是,这是一个阻塞调用,只会浪费线程资源。
通过事件处理程序和反应式编程来做到这一点会更有意义。有人会认为 JVM 可以向操作系统注册某种侦听器来侦听进程完成事件,并将其转发回程序。
是否存在这样的机制/ API?实现这一目标的任何替代方案或库?
如果您只需要支持 Windows、MacOS X 和 Linux,请使用NuProcess库。它使用回调模型提供对外部进程的非阻塞访问——包括 I/O 和程序终止。 披露:我是该图书馆的作者。
生成将等待进程完成的新线程:
final Process process = ...;
new Thread(new Runnable() {
@Override
public void run() {
try {
process.waitFor();
} catch (InterruptedException e) {
// thread is interrupted, check process state
}
// signal main thread
}
}).start();
或使用执行器:
Future<String> future = Executors.newSingleThreadExecutor().submit(new Callable<String>() {
@Override
public String call() throws Exception {
process.waitFor();
return "OK";
}
});
稍后允许您通过 Future API: future.isDone()
, future.cancel()
, ...检查作业状态
有人会认为 JVM 可以向操作系统注册某种侦听器来侦听进程完成事件,并将其转发回程序。
仅当 java 的所有目标操作系统都支持这种机制时。你有证据证明他们这样做吗?