OkHttp3 有两种运行方式:
1.同步阻塞调用并且直接返回;
2.通过内部线程池分发调度实现非阻塞的异步回调;
下面讲的是非阻塞异步回调,OkHttp在多并发网络下的分发调度过程,主要是Dispatcher
对象:
多线程:多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。但如果对多线程应用不当,会增加对单个任务的处理时间
ThreadPool线程池:线程池的关键在于线程复用以减少非核心任务的损耗。
T = T1+T2+T3其中T1和T3是多线程本身的带来的开销(在Java中,通过映射pThead,并进一步通过SystemCall实现native线程),我们渴望减少T1,T3所用的时间,从而减少T的时间。但一些线程的使用者并没有注意到这一点,所以在程序中频繁的创建或销毁线程,这导致T1和T3在T中占有相当比例。显然这是突出了线程的弱点(T1,T3),而不是优点(并发性)。
1.通过对线程进行缓存,减少了创建销毁的时间损失;
2.通过控制线程数量阀值,减少了当线程过少时带来的CPU闲置(比如说长时间卡在I/O上了)与线程过多时对JVM的内存与线程切换时系统调用的压力.
构造单例线程池:
public synchronized ExecutorService executorService() {
if (executorService == null) {
executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false));
}
return executorService;
}
参数说明:
- int corePoolSize: 最小并发线程数,这里并发同时包括空闲与活动的线程,如果是0的话,空闲一段时间后所有线程将全部被销毁。
- int maximumPoolSize: 最大线程数,当任务进来时可以扩充的线程最大值,当大于了这个值就会根据丢弃处理机制来处理
- long keepAliveTime: 当线程数大于
corePoolSize
时,多余的空闲线程的最大存活时间,类似于HTTP中的Keep-alive
- TimeUnit unit: 时间单位,一般用秒
- BlockingQueue<Runnable> workQueue: 工作队列,先进先出,可以看出并不像Picasso那样设置优先队列。(阻塞队列)
- ThreadFactory threadFactory: 单个线程的工厂,可以打Log,设置
Daemon
(即当JVM退出时,线程自动结束)等。
可以看出,在Okhttp中,构建了一个阀值为[0, Integer.MAX_VALUE]的线程池,它不保留任何最小线程数,随时创建更多的线程数,当线程空闲时只能活60秒,它使用了一个不存储元素的阻塞工作队列,一个叫做"OkHttp Dispatcher"的线程工厂。
也就是说,在实际运行中,当收到10个并发请求时,线程池会创建十个线程,当工作完成后,线程池会在60s后相继关闭所有线程。
aaarticlea/png;base64,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" alt="" />反向代理模型:
在OkHttp中,使用了与Nginx类似的反向代理与分发技术,这是典型的单生产者多消费者问题。我们知道在Nginx中,用户通过HTTP(Socket)访问前置的服务器,服务器会添加Header并自动转发请求给后端集群,接着返回数据结果给用户(比如简书上次挂了也显示了Nginx报错)。通过将工作分配给多个后台服务器并共享Session,可以提高服务的负载均衡能力,实现非阻塞、高可用、高并发连接,避免资源全部放到一台服务器而带来的负载,速度,在线率等影响。
作为任务的派发器,线程池对应多台后置服务器,用AsyncCall
对应Socket请求,用Deque<readyAsyncCalls>
对应Nginx的内部缓存