java线程池空余的线程是如何被回收

159 阅读1分钟

Java 线程池判断是否回收最大线程主要基于以下机制:

空闲时间判断

  • 核心原理:线程池中有一个keepAliveTime参数,当线程空闲时间超过该设定值时,就可能会被回收。线程执行完任务后,会进入等待状态,若在keepAliveTime时间内没有新任务分配给它,线程池就会认为该线程可以被回收。
  • 具体实现:线程池中的工作线程在执行完任务后,会调用getTask方法从任务队列中获取新任务。如果在keepAliveTime时间内无法获取到新任务,getTask方法会返回null,工作线程就会执行processWorkerExit方法,进行线程回收相关操作。

线程数量与核心线程数比较

  • 核心原理:线程池维护着核心线程数和最大线程数两个关键指标。当线程池中的线程数量大于核心线程数时,超出部分的线程在满足空闲时间等条件下就可能会被回收,以保证线程池中的线程数量尽可能维持在核心线程数附近,从而实现资源的合理利用。
  • 具体实现:在ThreadPoolExecutor类的addWorker方法中,会判断当前线程池中的线程数量是否超过核心线程数或最大线程数。如果超过核心线程数,并且当前线程是空闲状态且超过了keepAliveTime,则会尝试回收线程。