OkHttp阻塞式清理线程

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++;
        }

你可能感兴趣的:(OkHttp阻塞式清理线程)