1、继承关系
ThreadPoolExecutor继承于AbstractExecutorService-->ExecutorService-->Executor

2、线程池状态
1、用一个int类型表示,共32位,前三位表示线程池状态,后29位表示线程数量,线程池的状态有:
- RUNNING:接受新任务并且处理阻塞队列里的任务
- SHUTDOWN:拒绝新任务但是处理阻塞队列里的任务
- STOP:拒绝新任务并且抛弃阻塞队列里的任务同时会中断正在处理的任务
- TIDYING:所有任务都执行完(包含阻塞队列里面任务)当前线程池活动线程为0,将要调用terminated方法
- TERMINATED:终止状态。terminated方法调用完成以后的状态
2、各种状态之间的转换
- RUNNING -> SHUTDOWN
显式调用shutdown()方法,或者隐式调用了finalize(),它里面调用了shutdown()方法。 - RUNNING or SHUTDOWN)-> STOP
显式 shutdownNow()方法 - SHUTDOWN -> TIDYING
当线程池和任务队列都为空的时候 - STOP -> TIDYING
当线程池为空的时候 - TIDYING -> TERMINATED
当 terminated() hook 方法执行完成时候
3、构造函数
有四个构造函数,其他三个都是调用以下这个:
1 | public ThreadPoolExecutor(int corePoolSize, |
corePoolSize:线程池核心线程个数
workQueue:用于保存等待执行的任务的阻塞队列
maximunPoolSize:线程池最大线程数量
keepAliveTime:线程的存活时间。当线程池里的线程数大于corePoolSize时,如果等了keepAliveTime时长还没有任务可执行,则线程退出
ThreadFactory:创建线程的工厂,主要是为了给线程起名字,默认工厂的线程名字:pool-1-thread-3
TimeUnit:存活时间的时间单位
RejectedExecutionHandler:饱和策略,当队列满了并且线程个数达到maximunPoolSize后采取的策略
AbortPolicy:直接抛出
RejectedExecutionException异常;CallerRunsPolicy:使用调用者所在线程来运行任务;
DiscardOldestPolicy:调用poll丢弃队列里面最老的(队尾)任务,执行当前任务;
DiscardPolicy:默默丢弃,不抛出异常。
4、执行过程
1、如果当前线程池线程个数小于corePoolSize则调用addWorker开启新线程;否则添加任务到任务队列;如果任务队列满了,则尝试调用addWorker新开启线程执行任务,如果线程个数>maximumPoolSize则执行拒绝策略。
2、addWorker方法
1 | private boolean addWorker(Runnable firstTask, boolean core) { |
3、工作线程Worker的执行
1 | Worker(Runnable firstTask) { |
4、调用shutdown后,线程池就不会在接受新的任务了,但是工作队列里面的任务还是要执行的,但是该方法立刻返回的,并不等待队列任务完成在返回。调用awaitTermination完成队列里面的任务的处理
5、通过线程池状态来控制任务的执行,每个worker线程可以处理多个任务,线程池通过线程的复用减少了线程创建和销毁的开销,通过使用任务队列避免了线程的阻塞从而避免了线程调度和线程上下文切换的开销。