Java では、スレッド プールを閉じるには、shutdown()、shutdownNow()、および awaitTermination() の 3 つの方法があります。
1.'shutdown()'方法:
·このメソッドはスレッド プールをスムーズに閉じ、新しいタスクの送信を受け付けなくなります。
· すでに待機キューに入っているタスクも含め、送信されたすべてのタスクが完了するまで待機します。
・スレッドプールがクローズされている場合、このメソッドを呼び出しても効果はありません。
ExecutorService executor = Executors.newFixedThreadPool(5);
// 执行任务...
executor.shutdown(); // 关闭线程池
// 等待线程池中的任务执行完毕
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
// 处理中断异常
}
2.'shutdownNow()'方法:
・このメソッドはスレッドプールを強制的に閉じ、実行中のタスクの中断を試み、実行待ちのタスクのリストを返します。
スレッド プールの操作は直ちに停止され、待機キュー内のタスクは処理されなくなります。
・スレッドプールがクローズされている場合、このメソッドを呼び出しても効果はありません。
ExecutorService executor = Executors.newFixedThreadPool(5);
// 执行任务...
List<Runnable> unprocessedTasks = executor.shutdownNow(); // 强制关闭线程池
// 处理未执行的任务
for (Runnable task : unprocessedTasks) {
// 处理未执行的任务...
}
3.'awaitTermination()'方法:
・スレッドプール内のタスクの実行を待つ場合、または指定時間内にタスクが実行されるのを待つ場合に使用します。
次の条件のいずれかが満たされるまで、現在のスレッドはブロックされます。すべてのタスクが実行され、指定された待機時間を超え、現在のスレッドが中断されます。
これらのシャットダウン メソッドは、特定のニーズに応じて選択できます。shutdown() と awaitTermination() はスレッド プールをスムーズに閉じる方法を提供し、shutdownNow() はスレッド プールを即時に停止する方法を提供します。
ExecutorService executor = Executors.newFixedThreadPool(5);
// 执行任务...
executor.shutdown(); // 关闭线程池
// 等待线程池中的任务执行完毕,最多等待1小时
try {
if (!executor.awaitTermination(1, TimeUnit.HOURS)) {
// 执行超时处理
}
} catch (InterruptedException e) {
// 处理中断异常
}