java Process.waitfor是一个阻塞调用



我希望能够从 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";
        }
    });

稍后允许您通过未来 API 检查作业状态:future.isDone()future.cancel()、...

人们会认为JVM可以在操作系统中注册某种侦听器来侦听进程完成事件,并将其中继回程序。

仅当 Java 的所有目标操作系统都支持这种机制时。你有证据证明他们这样做吗?

相关内容

  • 没有找到相关文章

最新更新