OkHttp连接池put和get方法:
在上一次【https://www.cnblogs.com/webor2006/p/9281429.html】咱们分析了连接拦截器,如下:
不管是Http1.0还是Http2.0,它们的keep-alive机制或者Http2.0的多路复用机制在实现上都需要引入一个连接池的概念,来维护OkHttp的网络连接,而在OkHttp将客户端与服务器的连接抽象成了一个叫Connection的抽象接口,如下:
而它的具体实现类为RealConnection类,如下:
而为了管理所有的Connection,Okhttp设计了连接池:ConnectionPool,如下:
也就是该连接池的作用就是在一定时间范围之内复用连接,先来看一下它里面提供的put和get方法,如下:
先来看一下它的get方法是如何从连接池中来得到一个复用的连接对象的:
实现代码比较短,下面具体来看一下:
如果满足条件,则会获取连接,如下:
那具体是如何acquire()的呢?
而看一下allocations又是个什么变量:
那有啥用呢?其实这个变量是为了看一个网络连接它的负载量是否超过了它的最大值判断而用的。
回到主流程:
接下来看一下put方法,其实它更加简单,如下:
其中connections是一个队列,如下:
下面总结一下关于连接的东东:
1、首先会在重试拦截器中产生一个StreamAllocation对象,如下:
2、StreamAllocation对象的弱引用添加到RealConnection对象的allocations集合中:
3、从链接池中获取相应连接。
OkHttp连接池connection回改:
对于连接池肯定有一个自动清理的机制,不可能无限可以往池中添加连接对象,而在上面的put方法中其实就已经看到有一个清理线程了,如下:
所以接下来就分析一下该清理线程如何实现的:
好,重点就是看如何进行清理的,点进去看一下:
实际上它是采用的GC标记清除算法,先标记出最不活跃的连接,然后将其清理出去,下面看这块的核心代码:
那是如何标记最不活跃的连接的呢?
接着就根据遍历的结果进行清除处理,继续往下看:
此时回到主流程就会退出了,如下:
总结一下:
1、okHttp使用了GC回收算法。
2、StreamAllocation的数量会渐渐变成0。
3、被线程池监测到并回收,这样就可以保持多个健康的keep-alive连接。