2024-03-23
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1525304288

我们知道线程池是一种基于池化思想管理线程的工具,它带来了一系列的好处:

  • 降低资源消耗:通过重复利用现有的线程来执行任务,减少了线程创建和销毁的开销。
  • 提高响应速度:线程的创建是需要时间和资源的,利用现有线程执行任务,省去了创建线程的时间,拿到任务后可以立刻执行。
  • 提高线程的可管理性:线程是一种稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。

当我们创建好一个线程池后,线程池在执行任务的过程中会不断地创建和销毁线程(非核心线程),但是核心线程(数量由 corePoolSize 决定)默认会一直存活在线程池中,当没有任务的时候,这些线程会“休眠等待”,当有任务提交时,会被“唤醒”执行任务。

当线程池用完以后,这些核心线程会在线程池中一直休眠等待,直到调用 shutdown() 来关闭线程池。所以,如果我们不调用 shutdown() 来关闭线程池,这些核心线程会一直占用系统资源,只有调用 shutdown() 关闭线程池后,这些休眠状态下的线程才会彻底销毁被释放。所以,从这个角度看,线程池用完后,调用 shutdown() 释放线程是有必要的。

但是,在实际开发中,我们有时候会使用一些全局的线程池(比如利用 Spring),如果我们用完这些线程池后就直接关闭,这样就会导致两个问题:

  1. 如果有其他业务正在使用这个线程池执行任务,如果我们调用 shutdown() 关闭线程池就会影响这些任务的执行。
  2. 如果我们的业务场景使用线程池比较频繁,如果使用完后,就调用 shutdown() 关闭线程池,就会导致系统频繁创建线程池和销毁线程池。

所以,线程池执行完成后要不要调用 shutdown() 需要根据业务场景来定。

大明哥认为以下场景需要关闭线程池:

  1. 临时使用:如果线程池是为了执行一组特定任务而创建的,并且之后就不需要了,那么需要在任务执行完成后关闭线程池。
  2. 任务频率较低:如果一组任务执行的频率很低,那么在任务执行完成后也需要关闭线程池。