web-dev-qa-db-ja.com

JavaでExecutor ThreadPoolの実行を停止する方法は?

Javaで同時にエグゼキューターに取り組んでいます。同時により多くのスレッドを実行します。実行可能なオブジェクトのセットがあり、それをエグゼクターに割り当てます。エグゼキューターは正常に動作しており、すべてが結構です。しかし、すべてのタスクがプールで実行された後、Javaプログラムは終了しません。実行者がスレッドを強制終了するのに少し時間がかかると思います。すべてのタスクを実行した後、エグゼキュータによって。

24
Rajapandian

ExecutorService クラスには、このための2つのメソッド shutdown() および shutdownNow() があります。

Shutdown()メソッドを使用した後、 awaitTermination() を呼び出して、すべての開始済みタスクが完了するまでブロックできます。タイムアウトを指定して、永久に待機しないようにすることもできます。

私が提供しているこれらのリンクのいくつかをクリックしたいかもしれません。彼らは直接あなたがこのものを自分で読むことができるドキュメントに行きます。

26

executor.shutdown()とawaitTermination(timeout)は、スレッドを強制終了しません。 (つまり)、実行可能なタスクがポーリングループ内にある場合、タスクは強制終了されません。タイムアウトに達したときに実行可能なタスクを中断するだけです。したがって、実行可能クラスのコードで、ある条件で待機する場合は、条件を次のように変更できます。

while (flagcondition && !Thread.currentThread().isInterrupted()) {}

これにより、whileループの終了時にスレッドが中断されると、タスクが確実に停止します。または、中断された例外をキャッチし、catchブロックでflag = falseを設定してスレッドを終了することもできます。

try {
    // do some stuff and perform a wait that might throw an InterruptedException
} catch (InterruptedException e) {
    flagcondition = false;
}

プロファイラーを使用して、一部のスレッドが完了しなかった理由を調べることもできます。

12
Jagadish