我希望能够从JVM中启动外部流程,并在完成后完成。
我可以使用ProcessBuilder创建一个Process,然后使用Process.waitFor()来等待它的完成。但是,这是一个阻塞调用,只会浪费线程资源。
通过事件处理程序和反应式编程来实现这一点会更有意义。有人会认为JVM可以通过操作系统注册某种监听器来监听进程完成事件,并将其转发回程序。
是否存在这样的机制/ API?任何替代品或图书馆实现这一目标?
答案 0 :(得分:4)
如果您只需要支持Windows,MacOS X和Linux,请使用NuProcess库。它使用回调模型提供对外部进程的非阻塞访问 - 包括I / O和程序终止。 披露:我是该库的作者。
答案 1 :(得分:3)
生成将等待进程完成的新线程:
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()
,...
答案 2 :(得分:1)
有人会认为JVM可以在操作系统中注册某种监听器来监听进程完成事件,并将其转发回程序。
只有当java的所有目标操作系统都支持这样的机制时。你有证据证明他们有吗?