版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33706840/article/details/82944931
Dispatcher分析
Dispatcher
管理同步/异步请求状态,维护请求状态、线程池,执行相应的请求
Dispatcher
设置最大请求数为64,最大请求主机数为5,同时内部存在三个队列:readyAsyncCalls
:准备就绪的异步等待队列runningAsyncCalls
:正在运行的异步队列,包括还没有执行完成而点击了取消的请求runningSyncCalls
:正在运行的异步队列,包括还没有执行完成而点击了取消的请求
- 同步请求时直接将
call
对象加入到运行的请求队列中
- 异步请求时,首先判断正在运行的队列数量是否小于最大请求数以及运行主机数是否小于最大请求主机数,若满足,则加入到正在运行的请求队列中,通过线程池执行请求任务:反之,加入到缓存队列。
- 线程池的创建核心数为0,最大线程数为
Integer.MAX_VALUE
,空闲线程存活时间为60秒,阻塞队列SynchronousQueue
- 无论是同步还是异步请求,执行过程是否出现异常都会执行:
- 在
finished()
中,首先移除执行完成的当前请求,异步请求则进行队列调整,计算正在运行的队列中的数量。
promoteCalls()
如果正在运行的队列请求数大于最大值直接返回,缓存等待队列为空直接返回,然后迭代器next()
遍历AsyncCall
,通过runningCallsForHost()
判断运行主机数是否小于5,若小于则从缓存等待队列中移除该请求,加入到正在运行的队列中,然后通过线程池执行该请求
runningCallsCount()
表示异步与同步运行的请求队列数量总和