一、什么是线程池?
线程池,从字面含义来看,是指管理一组同构工作线程的资源池。线程池是与工作队列密切相关的,其中在工作队列中保存了所有等待执行的任务。工作线程的任务很简单:从工作队列中获取一个任务,执行任务,然后返回线程池并等待下一个任务。
二、线程池的优点
“在线程池中执行任务”比“为每个线程分配一个任务”优势更多。通过重用现有的线程而不是创建线程,可以在处理多个请求时分摊在线程创建和销毁过程中产生的巨大开销。另一个额外的好处是,当请求到达时,工作线程通常已经存在,因此不会由于等待创建线程而延迟任务的执行,从而提高了响应性。通过适当的调整线程池的大小,可以创建足够的线程以便使处理器保持忙碌状态,同时还可以防止过多线程相互竞争资源而使应用程序耗尽内存或失败。
三、线程池的执行流程
1. 提交一个新线程任务,线程池会在线程池中分配一个空闲线程,用于执行线程任务;
2. 如果线程池中不存在空闲线程,则线程池会判断当前“存活的线程数”是否小于核心线程数corePoolSize。
如果小于核心线程数corePoolSize,线程池会创建一个新线程(核心线程)去处理新线程任务;
如果大于核心线程数corePoolSize,线程池会检查工作队列;
如果工作队列未满,则将该线程任务放入工作队列进行等待。线程池中如果出现空闲线程,将从工作队列中按照FIFO的规则取出1个线程任务并分配执行;
如果工作队列已满,则判断线程数是否达到最大线程数maximumPoolSize;
如果当前“存活线程数”没有达到最大线程数maximumPoolSize,则创建一个新线程(非核心线程)执行新线程任务;
如果当前“存活线程数”已经达到最大线程数maximumPoolSize,直接采用拒绝策略处理新线程任务;
综上所述,执行顺序为:核心线程、工作队列、非核心线程、拒绝策略。
四、线程池的状态
线程池的状态分为:
RUNNING
运行状态,线程池被一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0。该状态的线程池会接收新任务,并处理工作队列中的任务。
调用线程池的shutdown()方法,可以切换到SHUTDOWN关闭状态;
调用线程池的shutdownNow()方法,可以切换到STOP停止状态;
SHUTDOWN
关闭状态,该状态的线程池不会接收新任务,但会处理工作队列中的任务;
当工作队列为空时,并且线程池中执行的任务也为空时,线程池进入TIDYING状态;
STOP
停止状态,该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行 的任务;
线程池中执行的任务为空,进入TIDYING状态;
TIDYING
整理状态,该状态表明所有的任务已经运行终止,记录的任务数量为0;
terminated()执行完毕,进入TERMINATED状态;
TERMINATED
终止状态,该状态表示线程池彻底关闭。