在平时的小系统中,线程池的关闭可以用executorService.shutdown()或者executorService.shutdownNow(),但是线程池不一定会关闭,这时候我们可以采用Java官方给出的Api示例进行优雅处理。
官网地址:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/ExecutorService.html
其中有如下示例
直接上demo示例
package com.atguigu.interview2.juc.my;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* ThreadpoolDemo
* @date 2025/02/10
*/
public class ThreadpoolDemo {
public static void main(String[] args) {
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(3);
try {
// 业务
} catch (Exception e) {
e.printStackTrace();
} finally {
// 小系统用,shutdown()和shutdownNow()二选一,一般用shutdown()
// 当调用 shutdown() 方法时,线程池将不再接受新的任务提交,但是会继续执行已经在队列中等待的任务。
executorService.shutdown();
// 与 shutdown() 不同,shutdownNow() 试图立即停止所有正在执行的任务,并且忽略队列中的待处理任务,紧急情况用。
executorService.shutdownNow();
// 大系统用
shutdownAndAwaitTermination(executorService);
}
}
// java17官方示例 https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/ExecutorService.html
public static void shutdownAndAwaitTermination(ExecutorService pool) {
// Disable new tasks from being submitted 禁止向线程池提交新任务
pool.shutdown();
try {
// Wait a while for existing tasks to terminate 等待一段时间让已存在的任务终止
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
// Cancel currently executing tasks 如果超过60秒仍有任务未完成,则取消当前正在执行的任务
pool.shutdownNow();
// Wait a while for tasks to respond to being cancelled 再次等待一段时间,看是否有任务响应取消操作
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
// 抛出异常
System.err.println("Pool did not terminate");
}
}
} catch (InterruptedException ex) {
// (Re-)Cancel if current thread also interrupted 如果当前线程也被中断,则再次尝试取消所有任务
pool.shutdownNow();
// Preserve interrupt status 保留线程的中断状态
Thread.currentThread().interrupt();
}
}
}