OkHttp内部维护一个线程负责清理过期的连接,它是一个死循环,通过wait方法阻塞线程来控制线程的执行时间
1.cleanup方法负责计算清理的时间
-1:代表没有需要清理的线程
如果清理时间大于0,计算下一次清理的时间(让线程等待一段时间再执行)
private final Runnable cleanupRunnable = new Runnable() {
@Override public void run() {
while (true) {
long waitNanos = cleanup(System.nanoTime());
if (waitNanos == -1) return;
if (waitNanos > 0) {
long waitMillis = waitNanos / 1000000L;
waitNanos -= (waitMillis * 1000000L);
synchronized (ConnectionPool.this) {
try {
ConnectionPool.this.wait(waitMillis, (int) waitNanos);
} catch (InterruptedException ignored) {
}
}
}
}
}
};
2.System.nanoTime
纳秒级别的计时,由于计算机的执行速度很快,所以用纳秒来计时更加准确。
3. public final void wait(long timeout, int nanos)
传入nanos纳秒,来减少等待的误差.1毫秒==1000000纳秒,任何1纳秒的误差都将使等待时间加长1毫秒:当nanos>0时,timeout++
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}