0

だから私はRunnableを実装するJavaクラスを持っています。runメソッドには次のコードがありますが、なぜそれが見た目どおりに機能するのか完全には理解しておらず、誰かが私に説明してくれることを望んでいました。

コードは次のとおりです。

public void run() {
    Process p = null;
    ProcessBuilder builder = new ProcessBuilder();
    builder.redirectErrorStream(true);

    p = builder.command("/opt/program/testscript.sh").start();

    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line;

    try {
    while ((line = br.readLine()) != null) {
        log.info(line);
    }

    boolean running = true;
    while(running) {
        p.waitFor();
        running = false;
    }       

    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
        p.destroy();
    }
}

したがって、一番上の部分は、実行中のプロセスから出力を取得して表示することです。ただし、中央の部分は、コードがスレッドの処理を待機する場所のようです。私が理解しているように、コードは停止し、スレッドが終了するまでコマンドのwhileループで待機する必要がありますp.waitFor()。その後、すべてが終了するはずです。ただし、スレッドの実行中は出力が引き続き表示されるため、明らかに上部のwhileループがまだヒットしています。

スレッディングは常に私の弱点であり、明らかに私はここで何が起こっているのかを完全には把握していません。コードは機能するので、有効だと思います。おそらくそれは本来あるべき方法でコード化されていませんが?とにかく、助けてくれてありがとう。

アップデート

すべての情報をありがとう。while(running)ループは何もしないことは理にかなっています。削除します。以前に提供しなかった残りのコードを上記に追加して、誰かがさらに追加するものがある場合に備えて、さらにコンテキストを提供しました。

4

3 に答える 3

1

最初のループは、充填中の人がループをbr閉じると停止します。

p.waitFor()確かにp終了するまで待ちます。ループは 1 回だけ実行されるため、一種の無効なので、削除することもできます。

すっごく...pそれが完了して終了するまでbrを埋めていると仮定waitForすると、非常に短い時間だけ待つ必要があります。おそらくまったく待つ必要はありません。

p何が起こっているのかをより正確に理解するためには、コードビハインドが必要brです。

于 2012-04-05T14:56:09.223 に答える
1

一番上のループは、からのすべての入力brが使い果たされるまで実行され、スレッドはプロセスの実行pが完了するまで待機する必要があります。

まだ入力があるので、連続出力が表示されるのではないbrでしょうか?

于 2012-04-05T14:52:28.147 に答える
1

p.waitFor()プロセスが終了するのを待っているスレッドであり、「スレッドが終了するまで」待機していません。待機中のプロセスが終了する前にスレッドが中断された場合 (スレッドへの参照を持つプログラムの別の部分がスレッドを呼び出すことを選択しinterrupt()た場合、通常はプログラムがシャットダウンされているため)、プロセスが強制終了されp.destroy()ます。waitFor の while ループは役に立ちません。

Runnable を実装するコードを見ていますが、その Runnable を使用してスレッドが作成される場所については何も述べていません。その部分を探してください。その Runnable を使用して作成されているさまざまなスレッドがあると思います。

于 2012-04-05T14:55:20.583 に答える