上篇文章 ShutdownHook- Java 优雅停机解决方案 提到应用停机时需要释放资源,关闭连接。对于一些定时任务或者网络请求服务将会使用线程池,当应用停机时需要正确安全的关闭线程池,如果处理不当,可能造成数据丢失,业务请求结果不正确等问题。 关闭线程池我们可以选择什么都不做,JVM 关闭时自然的会清除线程池对象。当然这么做,存在很大的弊端,线程池中正在执行执行的线程以及队列中还未执行任务将会变得极不可控。所以我们需要想办法控制到这些未执行的任务以及正在执行的线程。 线程池 API 提供两个主动关闭的方法 ThreadPoolExecutor#shutdownNow 与 ThreadPoolExecutor#shutdown,这两个方法都可以用于关闭线程池,但是具体效果却不太一样。 线程池的状态 在说线程池关闭方法之前,我们先了解线程池状态。 线程池状态关系图如下: 从上图我们看到线程池总共存在 5 种状态,分别为: RUNNING:线程池创建之后的初始状态,这种状态下可以执行任务。 SHUTDOWN:该状态下线程池不再接受新任务,但是会将工作队列中的任务执行结束。 STOP.... 有更新! 一文教你安全的关闭线程池 Java