だから私は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)ループは何もしないことは理にかなっています。削除します。以前に提供しなかった残りのコードを上記に追加して、誰かがさらに追加するものがある場合に備えて、さらにコンテキストを提供しました。