来看看线程池的源码,主要的参数有,核心线程数 ,最大线程数,闲置时间,任务队列,线程创建工厂等等。核心线程数是指线程池会一直维护的线程个数,让这些线程一直属于存活的状态,不会使他消亡。最大线程数顾名思义是指线程池可以同时执行的最大数量,闲置时间是指空闲超过闲置时间的超过核心线程数的线程会被回收,任务队列则是线程池中的重点,我们进入ThreadPoolExecutor方法,可以看到任务队列需要传一个BlockingQueue,这里okhttp使用了
SynchronousQueue,SynchronousQueue是一种没有容量的容器,添加任务一定会失败,失败的话,则会比较最大线程数,如果小于最大线程数,则直接开启新线程。正好满足OkHttp无需等待高并发的特点。
简单总结一下:
当一个任务通过execute(Runnable)方法添加到线程池时:
线程数量小于corePoolSize,新建线程(核心)来处理被添加的任务;
线程数量大于corePoolSize,新任务被添加到等待队列,添加失败;
线程数量小于maximumPoolSize,新建线程执行新任务;
线程数量等于maximumPoolSize,使用RejectedExecutionHandler拒绝策略