ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
先来看看构造函数的参数,解释下:
- corePoolSize 除非设置allowCoreThreadTimeOut,否则就是保留在池中的线程数(即使它们是空闲的)
- maximumPoolSize 池中允许的最大线程数
- keepAliceTime 当线程数大于corePoolSize时,这是多余的空闲线程在终止新任务之前等待新任务的最长时间。
- unit keepAliveTime参数的时间单位
- workQueue 用于在任务执行前保存任务的队列。这个队列只包含execute方法提交的可运行任务。
- threadFactory 线程工厂
- handler 由于达到线程边界和队列容量而阻塞执行时使用的处理程序
1. 如果运行的线程小于corePoolSize,则尝试用给定的命令作为第一个任务启动一个新线程。
对addWorker的调用原子性地检查runState和workerCount,因此可以通过返回false来防止错误警报,因为错误警报会在不应该添加线程的时候添加线程。
2. 如果一个任务可以成功排队,那么我们仍然需要再次检查是否应该添加一个线程(因为自上次检查以来已有的线程已经死亡),或者池在进入这个方法后关闭。
因此,我们重新检查状态,如果必要的话,如果停止,则回滚队列;如果没有,则启动一个新线程。
3. 如果无法对任务排队,则尝试添加新线程。如果它失败了,我们知道我们被关闭或饱和,所以拒绝任务。