OkHttp源码分析(二)之任务调度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33706840/article/details/82944931

Dispatcher分析


Dispatcher管理同步/异步请求状态,维护请求状态、线程池,执行相应的请求

  1. Dispatcher设置最大请求数为64,最大请求主机数为5,同时内部存在三个队列:
    1. readyAsyncCalls:准备就绪的异步等待队列
    2. runningAsyncCalls:正在运行的异步队列,包括还没有执行完成而点击了取消的请求
    3. runningSyncCalls:正在运行的异步队列,包括还没有执行完成而点击了取消的请求

在这里插入图片描述

  1. 同步请求时直接将call对象加入到运行的请求队列中
    在这里插入图片描述
  2. 异步请求时,首先判断正在运行的队列数量是否小于最大请求数以及运行主机数是否小于最大请求主机数,若满足,则加入到正在运行的请求队列中,通过线程池执行请求任务:反之,加入到缓存队列。
    在这里插入图片描述
  3. 线程池的创建核心数为0,最大线程数为Integer.MAX_VALUE,空闲线程存活时间为60秒,阻塞队列SynchronousQueue
    在这里插入图片描述
  4. 无论是同步还是异步请求,执行过程是否出现异常都会执行:
    在这里插入图片描述
  5. finished()中,首先移除执行完成的当前请求,异步请求则进行队列调整,计算正在运行的队列中的数量。
    在这里插入图片描述
  6. promoteCalls()如果正在运行的队列请求数大于最大值直接返回,缓存等待队列为空直接返回,然后迭代器next()遍历AsyncCall,通过runningCallsForHost()判断运行主机数是否小于5,若小于则从缓存等待队列中移除该请求,加入到正在运行的队列中,然后通过线程池执行该请求
    在这里插入图片描述
  7. runningCallsCount()表示异步与同步运行的请求队列数量总和
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_33706840/article/details/82944931