私はProcessBuilderを使って外部プロセスを起動していますが、私はそれを強制終了する必要があります。今私は問題をプロセスを殺すが、何らかの理由で、エラーストリームがストリームを読んでスレッドが終了しないように閉じることはありません。これは私のプログラムを閉じないようにしてくれます。Java Stop ProcessとClose Streams
ここで、入力ストリームとエラーストリームから読み取るスレッドを開始します。
final Thread inputPrinter = new Thread() {
public void run() {
BufferedReader inputStream = new BufferedReader(new InputStreamReader(builder.getInputStream()));
String line;
try {
while ((line = inputStream.readLine()) != null) {
Util.println(line, false);
}
} catch (IOException e) {
} finally {
Util.println("input end");
try {
inputStream.close();
} catch (IOException e) {
}
}
}
};
inputPrinter.start();
Thread errorPrinter = new Thread() {
public void run() {
BufferedReader errorStream = new BufferedReader(new InputStreamReader(builder.getErrorStream()));
String line;
try {
while ((line = errorStream.readLine()) != null) {
Util.println(line, true);
}
} catch (IOException e) {
} finally {
Util.println("error end");
try {
errorStream.close();
} catch (IOException e) {
}
}
}
};
errorPrinter.start();
builder.waitFor();
Util.println("");
Util.println("Finished building project.");
ここに私のプロセスを停止するコードがあります。
try {
builder.getOutputStream().close();
builder.getInputStream().close();
builder.getErrorStream().close();
} catch (IOException e) {
e.printStackTrace();
}
builder.destroy();
Util.println("");
Util.println("Build aborted by user.", true);
私は次のように印刷され得るプロセスを停止してみてください。
ビルドがユーザーによって中止されました。
完成プロジェクト。
入力終了
私は「エラー終了」を取得していないと、プログラムのデバッグ決してスレッドは単に「のreadLine()」の前に座っていることを示します。
プロセスを待機しているコードは、自身のスレッド(プロセスを終了させるコードとは別)で実行されています。
errorPrinterスレッドが壊れていないことを確認するには、何が必要ですか?
破壊を呼び出す前にストリームを閉じないとどうなりますか? – assylias
空のキャッチブロックは何ですか?あなたはそれが悪いコードではないことを知っています、それはまったく危険な**コードです。 –
前にストリームでクローズしないと、まったく同じことが起こります。 空のキャッチブロックは、停止しても気にしないとなぜ危険なのですか? – EmbMicro