每一个线程都是一个Worker对象。
Worker是ThreadPoolExecutor的内部类。Worker继承于AQS,本身是一把锁。这把锁有什么用?在分析线程池的关闭、线程执行任务的过程时会了解到。
corePoolSize 核心线程数,在线程池中始终维护的线程个数
maxPoolSize 在线程数等于corePoolSize,队列已满的情况下,扩充线程数到这个值。
keepAliveTime/TimeUnit maxPoolSize空闲线程销毁所需的时间,总线程数会下降到corePoolSize
blockingQueue 线程池所使用的队列类型
threadFactory 线程创建工厂,可以自定义,有一个默认的DefaultThreadFactory
RejectedExecutionHandler corePoolSize已满,队列已满,maxPoolSize已满,最后的执行策略
处理流程:
currentThreadNum < corePoolSize 新建线程执行;如果currentThreadNum >= corePoolSize,则执行2
判断队列是否已满。如未满,则放入,如已满,执行3
currentThreadNum < maxPoolSize, 如果小于,则新建线程执行,否则执行4
根据拒绝策略,拒绝任务
总结:
先判断corePoolSize ,其次判断blockingQueue是否已满,再判断maxPoolSize,最后使用拒绝策略。
如果队列是无界的,则不可能走到第3、4步
拒绝策略
- 调用者直接在自己的线程里面执行,线程池不做处理
- 线程池直接抛出异常
- 线程池直接把任务丢掉
- 把队列里最老的任务移除,把新任务放入队列