一、什么是线程池
线程池是一种预先创建一定数量的线程,然后将多个任务分配给这些线程来执行的技术,它可以最大程度地减小线程的创建和销毁造成的开销,提高系统的性能和稳定性。线程池通常包含三个重要的组件:任务队列、工作线程和管理器,其中任务队列用于保存等待执行的任务,工作线程用于执行任务,管理器用于创建、销毁和监控线程池中的线程,以及分配任务给空闲线程。线程池可以提高程序的响应速度,减少资源占用率,提高系统的可扩展性和可靠性。
二、线程池的优点
- 提高性能:线程池可以最大程度地减少线程的创建和销毁造成的开销,提高系统的性能和响应速度。
- 减少资源占用率:线程池可以有效地管理线程资源,避免线程数量过多导致的资源浪费和系统负载过大。
- 提高稳定性:线程池可以避免线程过多导致的系统崩溃和不稳定性,确保系统持续稳定运行。
- 提高可扩展性:线程池可以方便地配置和调整线程数量,适应不同的系统需求和负载。
- 提高代码复用性:线程池可以将线程管理和任务调度等通用功能封装起来,可以在不同的应用场景中复用。
三、线程池的执行流程
- 创建新线程任务,有空余核心线程(最小线程数),给其分配空余的核心线程
- 没有空余线程且没有达到核心线程数,创建新的核心线程分配
- 达到核心线程且工作队列没满,将其放入工作队列,等待核心线程出现空闲
- 工作队列已满且非核心线程数(最大线程数)未满,创建非核心线程分配
-
非核心线程数已满,执行拒绝策略(
-
ThreadPoolExecutor.AbortPolicy :默认策略,丢弃任务并抛出 Rejected ExecutionException 异常;
-
ThreadPoolExecutor.DiscardPolicy :丢弃任务,但是不抛出异常;
-
ThreadPoolExecutor.DiscardOldestPolicy :丢弃工作队列中的队头任务(即最旧的任务,也就是最早进入队列的任务)后,继续将当前任务提交给线程池;
-
ThreadPoolExecutor.CallerRunsPolicy :由原调用线程处理该任务 (谁调用,谁处理);、
)
四、线程池的状态
RUNNING:运行状态,线程池被一旦被创建,就处于RUNNING 状态,并且线程池中的任务数为0 。该状态的线程池会接收新任务,并处理工作队列中的任务。调用线程池的 shutdown() 方法,可以切换到SHUTDOWN关闭状态;调用线程池的 shutdownNow() 方法,可以切换到STOP停止状态;
SHUTDOWN:关闭状态,该状态的线程池不会接收新任务,但会处理工作队列中的任务; 当工作队列为空时,并且线程池中执行的任务也为空时,线程池进入STOP状态;
STOP:停止状态,该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行的任务; 线程池中执行的任务为空,进入TIDYING状态;
TIDYING:整理状态,该状态表明所有的任务已经运行终止,记录的任务数量为0; terminated() 执行完毕,进入TERMINATED 状态;
TERMINATED : 终止状态,该状态表示线程池彻底关闭。