Dispatcher 调度
内部执行 http 请求的实际线程池
每一个OkHttpClient 实例将请求 Call 使用 Dispatcher 进行线程分发,在 Dispatcher 中通过 ExecutorService 线程池来执行每一个请求的。
初始化
1 | Dispatcher dispatcher = new Dispatcher(); |
主要参数说明
参数 | 描述 | 备注 |
---|---|---|
maxRequests | 当前 OkHttpClient 实例最大的并发请求数 | 默认:64。这个值一般要大于maxRequestPerHost。 |
maxRequestPerHost | 单个主机最大请求并发数,这里的主机指被请求方主机,一般可以理解对调用方有限流作用 | 默认:4 这个值设置,有如下几个场景考虑: - 如果被调用方的并发能力只能支持100,那这个值最好不要超过100,否则对调用方有压力 - 如果当前 OkHttpClient 实例只对一个调用方发起调用,那这个值与 maxRequests 保持一致 - 如果当前 OkHttpClient 实例在一个事务中对 n 个调用方发起调用,n * maxReuestPerHost 要接近 maxRequest |
executorService | 构造参数:内部线程池 | 可根据情况自定义线程池 |
executorService 默认初始化代码
1 | public synchronized ExecutorService executorService() { |
ConnectionPool 连接池
1)从 ConnectionPool 获取一个 RealConnection 对象,如果缓冲池里面没有就创建一个 RealConnection 对象并且放入 ConnectionPool 中,实际是放入 ConnectionPool 的 ArrayDeque 队列中
2)获取 RealConnection 对象后调用其 connect 打开 Socket 链接