一度により多くのスレッドを同時に実行するために、Javaのエグゼキューターに取り組んでいます。実行可能なオブジェクトのセットがあり、それをエグゼキューターに割り当てます。エグゼキューターは正常に動作しており、すべてが正常です。しかし、すべてのタスクがプールで実行された後、Javaプログラムは終了しません。エグゼキューターは、いくつかを取得すると思います。スレッドを強制終了する時間です。すべてのタスクを実行した後、エグゼキュータがかかる時間を短縮するために誰か助けてください。
2 に答える
ExecutorServiceクラスには、このための2つのメソッドshutdown()とshutdownNow()があります。
shutdown()メソッドを使用した後、awaitTermination()を呼び出して、開始されたすべてのタスクが完了するまでブロックできます。タイムアウトを指定して、永久に待機しないようにすることもできます。
私が提供しているこれらのリンクのいくつかをクリックすることをお勧めします。彼らはあなたが自分でこのことを読むことができるドキュメントに直接行きます。
awaitTermination(timeout)を指定したexecutor.shutdown()は、スレッドを強制終了しません。(つまり、実行可能なタスクがポーリングループ内にある場合、タスクは強制終了されません。タイムアウトに達したときに実行可能なタスクを中断するだけです。したがって、実行可能なクラスのコードで、ある条件で待機する場合は、条件を次のように変更することをお勧めします。
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;
}
また、プロファイラーを使用して、一部のスレッドが完了に進まなかった理由を調べることもできます。