1

Javaアプリから外部jarを実行しようとしています。

プロセスが正常に開始されて実行されているかどうかを確認するための最も洗練された方法は何ですか?

ExtApp.jarは長期間実行されるプロセスであるためProcess.waiFor()、アプリがブロックされるため使用できません。私は次のコードを思いつきました。その背後にある考え方は、プロセスがまだ終了していない場合にexitValue()スローするということです。IllegalThreadStateException

boolean success = false;
try {
    Process process = Runtime.getRuntime().exec("java -jar ExtApp.jar");
    try {
        if (process.exitValue() == 0) 
            success = true;
    } catch (IllegalThreadStateException e) {
        success = true;
    }
} catch (Exception e) {}

System.out.println(success);

しかし、それは一種の醜い解決策です。より良いもののためのアイデアはありますか?

4

2 に答える 2

2

上記は非常に疑わしいようです。プロセスをスポーンして、すぐにテストします。プロセス自体が、正常に実行されているかどうかを判断していない可能性があります(たとえば、jarファイルeixsts /がロード可能/有効であることを実際にチェックするのはいつですか?)

新しいスレッドを介してプロセスを生成し、を介してそのスレッドを呼び出し/ブロックし、プロセスが終了してユーザーが終了したらProcess.waitFor()、親スレッドに通知する方がよいと思います(状態変数、wait()/など)。終了ステータスを収集しました。notify()java.util.concurrent.Future

Apache Commons Execは、プロセス終了の非同期スポーン/通知など、この種の作業を行うための便利なライブラリです。詳細については、DefaultExecuteResultHandlerを参照してください。

于 2012-12-10T12:07:51.090 に答える
2

この問題に対するエレガントな解決策はないようです。たとえば、ExtApp.jarがないのに、PCでコードを実行し、「成功」しました。つまり、Runtime.execの観点からは、その後に何が起こっても、プロセス(java.exe)は正常に開始されました。

于 2012-12-10T12:23:04.027 に答える