1. 场景
Tomcat下面部署application,application创建了线程池。在执行tomcat的shutdown之后(不是kill -9命令),线程池没有关闭,导致资源浪费等问题
2. 原因
有2种情况,一种是用户线程和守护线程;还一种是线程池没有响应容器关闭的信号。
(1)关于用户线程和守护线程的区别,这里不再赘述,不懂的可以搜一下。我们自己new的ThreadPoolExecutor或者通过Executors创建的线程池。如果没有使用自定义的ThreadFactory,都是使用JDK默认的DefaultThreadFactory。DefaultThreadFactory创建的线程都是用户线程。如果用户线程一直在执行,或者在循环,用户线程不会自动关闭。如果是守护线程,会在其他用户线程关闭之后自动关闭。所以第一种情况就是,线程池里面是用户线程。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
<