1

Javaを介してプロセスを実行および強制終了しているときに、奇妙な問題に直面しました。

基本的に、taskkillを使用して1つのプロセスを強制終了するメソッドがあります。

private static void kill() {
    try {
      Runtime.getRuntime().exec("taskkill /F /IM app.exe");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

このメソッドを呼び出して、新しいプロセスを開始する前にすべてのプロセスが強制終了されていることを確認します。

    kill();
    ProcessBuilder procBuilder = new ProcessBuilder(args);

    try {
        Process p = procBuilder.start();
    } catch (Exception e) {
        e.printStackTrace();
    }

問題は、開始されたプロセスがタスクキルによって強制終了されたように見えることです。殺すという呼びかけがなければ、それは完全にうまく機能します。キルすると、プロセスは開始されますが、GUIは表示されません。

これは2つの呼び出し間の優先順位の問題ですか?(runtime.execの優先度はProcessBuilder.startよりも低くなりますか?)

Runtime execの戻り時にwaitForを使用して解決しましたが、なぜこの問題が発生したのか知りたいです。

4

2 に答える 2

2

基本的Runtime.execに、OS で新しいプロセスが非同期に開始され、新しいプロセスが開始される前にプロセスが終了するという保証はありません。taskkill理論的には、 が結果を返すのを待ってSUCCESSから、新しいジョブを開始する必要があります。ドキュメントによるとtaskkill、容疑者の殺害に成功した場合はリターン コード 0 で通知されます。

于 2012-11-12T14:47:26.647 に答える
0

どちらもデフォルトの優先度を持つため、この問題は優先度に関連していません。考えられる問題は、aをRuntime.exec使用するStringと、入力を解析してからコマンドProcessBuildを実行する必要がありますが、必要な解析ロジックなしで指定されたコマンドを実行することです。このため、わずかな遅延が見waitForられ、意図したとおりに動作する必要があります。String[]のバージョンを使用することで、この遅延をなくすことができますRuntime.exec。また、スレッドはシステムスケジューラによってスケジュールされ、実行順序は予測できないことに注意してください。Javaスレッドの予測不可能を参照してください。

于 2012-11-12T15:01:11.640 に答える