线程池
线程池里面分为核心线程和非核心线程。 核心线程是常驻在线程池里面的工作线程,它有两种方式初始化:
- 向线程池里面添加任务的时候,被动初始化
- 主动调用 prestartAllCoreThreads 方法
当线程池里面的队列满了的情况下,为了增加线程池的任务处理能力。线程池会增加非核心线程。核心线程和非核心线程的数量,是在构造线程池的时候设置的,也可以动态进行更改 。
非核心线程
由于非核心线程是为了解决任务过多的时候临时增加的,所以当任务处理完成后,工作线程处于空闲状态的时候,就需要回收。
因为所有工作线程都是从阻塞队列中去获取要执行的任务,所以只要在一定时间内,
阻塞队列没有任何可以处理的任务,那这个线程就可以结束了。
这个功能是通过阻塞队列里面的 poll 方法来完成的。这个方法提供了超时时间和超时
时间单位这两个参数
当超过指定时间没有获取到任务的时候,poll 方法返回 null,从而终止当前线程完成线程回收。
核心线程
默认情况下,线程池只会回收非核心线程,如果希望核心线程也要回收,可以
设置 allowCoreThreadTimeOut 这个属性为 true,一般情况下我们不会去回收核心线
程。
因为线程池本身就是实现线程的复用,而且这些核心线程在没有任务要处理的时候是处
于阻塞状态
并没有占用 CPU 资源。