OkHttp框架源码分析之 - Dispatcher分发器类

OkHttp框架源码分析之 - Dispatcher分发器类

1.1 Q1. OkHttp如何实现同步异步请求?

发送的同步/异步请求都会通过Dispatcher类来管理其同步/异步请求队列的状态

1.2 Q2.到底什么是Dispatcher?

Dispatcher的作用是通过维护不同的缓存队列来维护同步/异步请求的状态,并维护了一个线程池,用于高效执行相应的请求

1.3 Dispatcher源码分析

先看几个重要变量:

private ExecutorService executorService;
private final Deque<AsyncCall> readyAsyncCalls = new ArrayDeque();
private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque();
private final Deque<RealCall> runningSyncCalls = new ArrayDeque();

其中private ExecutorService executorService;是Dispatcher分发器类维护的线程池,它维护了同步/异步网络请求,并高效执行同步/异步网络操作;
private final Deque<AsyncCall> readyAsyncCalls = new ArrayDeque();是等待执行的异步请求缓存队列,当条件不满足时访问的异步请求就会进入到等待执行的异步请求队列当中来进行缓存,当条件再次满足时,就会把这里面的异步请求放入正在执行的异步请求队列中去进行执行;
private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque();是正在执行的异步请求队列,它包含了已经取消但没有执行完的异步请求;
private final Deque<RealCall> runningSyncCalls = new ArrayDeque();是正在执行的同步请求队列

1.4 Q3.Dispathcer类在哪个线程中执行?

Dispatcher类默认在主线程中执行

1.5 Q4.异步请求为什么需要两个队列?

异步请求维护了两个队列,一个是正在执行的异步请求队列,一个是等待执行的异步请求缓存队列,可以理解成生产者消费者模型,Dispatcher分发器类对应于生产者,ExecutorService线程池对应于消费者池,因此需要两个队列来存放正在执行的异步请求和等待执行的异步请求
这里写图片描述

每当新的请求通过调用call.enqueue进入到分发器类Dispatcher中的时候,就会判断,当正在执行的异步请求数小于64,相同主机的网络请求数小于5时,就会把这个请求加入到正在执行的异步请求队列当中,并通过线程池执行网络请求操作,否则就会加入到等待执行的异步请求缓存队列当中去,当正在执行的异步请求队列有空间了再将缓存中的异步请求转移到正在执行的异步请求缓存队列当中去,当请求执行完之后,会调用finished方法中的promoteCall()这个调度任务的方法,它会手动清除缓存区

1.6 Dispatcher分发器类源码是如何实现同步/异步请求的

  • Dispatcher分发器类源码是如何实现同步请求的

同步请求会执行RealCall的execute()方法,

@Override public Response execute() throws IOException {
  synchronized (this) {
    if (executed) throw new IllegalStateException("Already Executed");
    executed = true;
  }
  captureCallStackTrace();
  eventListener.callStart(this);
  try {
    client.dispatcher().executed(this);
    Response result = getResponseWi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值