OkHttp 池配置

Dispatcher 调度

内部执行 http 请求的实际线程池

每一个OkHttpClient 实例将请求 Call 使用 Dispatcher 进行线程分发,在 Dispatcher 中通过 ExecutorService 线程池来执行每一个请求的。

初始化

1
2
3
4
5
Dispatcher dispatcher = new Dispatcher();
// Dispatcher dispatcher = new Dispatcher(Executors.newCachedThreadPool());
dispatcher.setMaxRequests(64);
dispatcher.setMaxRequestsPerHost(4);
builder.dispatcher(dispatcher);

主要参数说明

参数 描述 备注
maxRequests 当前 OkHttpClient 实例最大的并发请求数 默认:64。这个值一般要大于maxRequestPerHost。
maxRequestPerHost 单个主机最大请求并发数,这里的主机指被请求方主机,一般可以理解对调用方有限流作用 默认:4
这个值设置,有如下几个场景考虑:
- 如果被调用方的并发能力只能支持100,那这个值最好不要超过100,否则对调用方有压力
- 如果当前 OkHttpClient 实例只对一个调用方发起调用,那这个值与 maxRequests 保持一致
- 如果当前 OkHttpClient 实例在一个事务中对 n 个调用方发起调用,n * maxReuestPerHost 要接近 maxRequest
executorService 构造参数:内部线程池 可根据情况自定义线程池

executorService 默认初始化代码

1
2
3
4
5
6
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;
}

ConnectionPool 连接池

1)从 ConnectionPool 获取一个 RealConnection 对象,如果缓冲池里面没有就创建一个 RealConnection 对象并且放入 ConnectionPool 中,实际是放入 ConnectionPool 的 ArrayDeque 队列中

2)获取 RealConnection 对象后调用其 connect 打开 Socket 链接

  • 本文作者: forever杨
  • 本文链接: https://blog.yl-online.top/posts/c17653b2.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。如果文章内容对你有用,请记录到你的笔记中。本博客站点随时会停止服务,请不要收藏、转载!