我们知道线程池是一种基于池化思想管理线程的工具,它带来了一系列的好处:
- 降低资源消耗:通过重复利用现有的线程来执行任务,减少了线程创建和销毁的开销。
- 提高响应速度:线程的创建是需要时间和资源的,利用现有线程执行任务,省去了创建线程的时间,拿到任务后可以立刻执行。
- 提高线程的可管理性:线程是一种稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。
当我们创建好一个线程池后,线程池在执行任务的过程中会不断地创建和销毁线程(非核心线程),但是核心线程(数量由 corePoolSize
决定)默认会一直存活在线程池中,当没有任务的时候,这些线程会“休眠等待”,当有任务提交时,会被“唤醒”执行任务。
当线程池用完以后,这些核心线程会在线程池中一直休眠等待,直到调用 shutdown()
来关闭线程池。所以,如果我们不调用 shutdown()
来关闭线程池,这些核心线程会一直占用系统资源,只有调用 shutdown()
关闭线程池后,这些休眠状态下的线程才会彻底销毁被释放。所以,从这个角度看,线程池用完后,调用 shutdown()
释放线程是有必要的。
但是,在实际开发中,我们有时候会使用一些全局的线程池(比如利用 Spring),如果我们用完这些线程池后就直接关闭,这样就会导致两个问题:
- 如果有其他业务正在使用这个线程池执行任务,如果我们调用
shutdown()
关闭线程池就会影响这些任务的执行。 - 如果我们的业务场景使用线程池比较频繁,如果使用完后,就调用
shutdown()
关闭线程池,就会导致系统频繁创建线程池和销毁线程池。
所以,线程池执行完成后要不要调用 shutdown()
需要根据业务场景来定。
大明哥认为以下场景需要关闭线程池:
- 临时使用:如果线程池是为了执行一组特定任务而创建的,并且之后就不需要了,那么需要在任务执行完成后关闭线程池。
- 任务频率较低:如果一组任务执行的频率很低,那么在任务执行完成后也需要关闭线程池。