ThreadPoolExecutor源码
在Android-27中查看源码:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {}
corePoolSize:除非设置了allowCoreThreadTimeOut,否则即使它们处于闲置状态,也要在线程池中保留的线程数量
maximumPoolSize:在线程池中允许的最大线程数
keepAliveTime:当线程数超过corePoolSize时,处于闲置状态的非核心线程等待执行新的任务的最大等待时间,超过便会终止。
workQueue:在任务没有执行之前,用来保存任务的队列
threadFactory:用来创建线程的工厂
handler:当达到线程的边界和队列的容量时执行被阻塞,这个时候handler就会被用到
接下来看常用的execute方法:
图11、如果线程的数量小于corePoolSize,试图创建一个新线程,将command作为它的第一个任务。调用addWorker时自动检查运行状态和工作线程数量,以便于防止在不能添加线程时添加了线程。当线程数量>=corePoolSize或者添加核心线程失败时走2,3
2、如果一个任务可以成功的加入到队列,我们需要再次检查是否应该添加一个线程,因为再次检查时,已经存在的线程可能已经不在运行了。所以我们需要重新检查线程池状态,如果已经不在运行,就需要将该任务从任务队列删除。或者在没有线程的时候创建一个新的线程。
3、如果我们无法加入队列,我们试图添加一个新的非核心线程。如果失败,我们就知道线程池已经关闭或者已经饱和了,因此拒绝执行该任务。
图2在图2中的addWorker方法中可以看到线程池的状态处于RUNNING和线程数没有达到最大容量且工作线程的数量小于(核心线程?核心线程数:最大线程数)时就可以将该线程加入到工作线程中,同时启动该线程。其中Thread的源码可以参考Thread源码 - 简书