7

JVM 内から外部プロセスを開始し、その完了に到達できるようにしたいと考えています。

ProcessBuilder を使用して Process を作成し、 Process.waitFor() を実行してその完了を待つことができます。ただし、これはブロッキング呼び出しであり、単にスレッド リソースを浪費します。

イベント ハンドラーとリアクティブ プログラミングを使用してこれを行う方が理にかなっています。JVM は OS にある種のリスナーを登録して、プロセス完了イベントをリッスンし、それをプログラムに中継できると考える人もいるでしょう。

そのようなメカニズム/ API は存在しますか? これを実現する代替手段またはライブラリはありますか?

4

3 に答える 3

5

Windows、MacOS X、および Linux のみをサポートする必要がある場合は、 NuProcessライブラリを使用してください。I/O やプログラムの終了など、コールバック モデルを使用して外部プロセスへのノンブロッキング アクセスを提供します。 開示:私は上記のライブラリの作成者です。

于 2013-10-16T13:34:51.180 に答える
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()、...

于 2012-12-07T16:27:17.853 に答える
1

JVM は OS にある種のリスナーを登録して、プロセス完了イベントをリッスンし、それをプログラムに中継できると考える人もいるでしょう。

Java のすべてのターゲット オペレーティング システムがそのようなメカニズムをサポートしている場合のみ。彼らがそうしているという証拠はありますか?

于 2012-12-07T22:46:53.293 に答える