我们来看一下okhttp的Dispatcher.java中创建的线程池是什么样的
public synchronized ExecutorService executorService() {
if (executorService == null) {
// 核心线程数0
// 最大线程数Integer.MAX_VALUE
// 空闲线程超时时间60
// 空闲线程超时时间的单位TimeUnit.SECONDS
// 线程等待队列SynchronousQueue(容量为0的队列)
// 指定线程工厂
executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false));
}
return executorService;
}
重要的参数有两个
1.核心线程数 0
为什么核心线程数要是0呢,okhttp这样做是因为考虑到比如一个应用我只会使用一次网络请求,之后再不会使用了,那么缓存了核心线程是没有意义的
2.线程等待队列SynchronousQueue
SynchronousQueue是一个容量为0的BlockingQueue,当一个新任务到来的时候,核心线程为0,这时会看有没有空闲线程,如果没有空闲线程那么这时必须要往等待队列中添加,但是等待队列容量为0,那么注定是添加不成功的,那么就会走新建线程或拒绝策略的逻辑,因为最大线程数是Integer.MAX_VALUE,那么肯定会走新建线程的逻辑,这样就会实现了任务的最大并发,我的任务过来了不会由于我的代码而发生没必要的阻塞。