本文将分析Java线程池ThreadPoolExecutor的实现原理,掌握了实现原理能帮助你更好的优化程序的性能,避免很多错误用法。本文的代码量较少,主要讲原理,等你把原理完全弄明白了代码随便一写一大堆。
1. 线程池的状态
首先,线程池是一个有状态的对象。状态有以下几种:
· RUNNING: 运行中。此时线程池能接受任务,并且会处理队列中的任务;
· SHUTDOWN: 关闭中。此时,线程池不接受新任务,但是会处理队列中的任务;
· STOP: 停止。此时线程池不接受新任务,也不会处理队列中的任务,还会中断worker线程。
· TIDYING: 清理中。所有任务都已终止且线程数等于0,开始调用terminated()。
· TERMINATED: 终止。terminated()执行结束。
线程池的状态变化方式如下图所示。
2. 线程池的内部组件
线程池的内部主要包含如下表所示组件。知道ThreadPoolExecutor内部包含哪些对象,基本就清楚线程池的实现原理了。注意,表中未给出largestPoolSize、completedTaskCount、keepAliveTime、corePoolSize和maximumPoolSize等参数。