okhttp dispatcher 之异步执行方法源码分析(同步
这是我第一次写博客 当然不可能是最后一次 我只是希望通过写这些博客可以巩固和沉淀自己的知识并且能提高自己和发现自己的不足。。。So
不墨迹!!开局先放图
首先我们从异步执行的方法进去瞅一瞅 它这里先是判断了队列里正在执行异步任务的数量是否小于64 和最大的请求量是否超过5 如果符合则添加进队列 然后通过创建线程池的这个方法执行线程操作 如果不符合则加入准备执行异步任务的队列中
下面我们就去executorService这个创造线程池的方法去瞅一瞅 任然是先上图为敬
从这里可以看出他这里是创建了一个线程池来处理网络请求 第一个线程池的参数是表示线程池的基本大小 意思是 一直存在的线程 就算它是空闲的 没有任务执行也不会被销毁除非限定的时间到了 第二个表示最大被允许容纳的线程数量(如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务 具体自己去看源码) 第三个是保存线程复用的时间 第四个是时间单位 第五个是工作队列 它这里用的是一个阻塞队列 第六个参数是表示一个创造线程的方法 下面 我们就进入这个treadFactory这个方法瞅一瞅 前面的大家可以去看一下其他大佬关于线程池的博客 这里我就不详细解释了
可以看出这个方法里面创建了线程 threadFactory 是java.util.concurrent 这个包下面的创建线程接口 (这个可以去自己看源码 里面有英文解释 ) 然后我们再回到前面异步执行的方法 我们再去那个线程池执行方法 .execute().这个方法里面去看看
发现其只是一个接口中的方法 从它的参数可以看出是一个Runnable 对象 我们再回到前面的enqueue的 .execute(call)这个方法 可以看到它传的参数是一个AsyncCall类 我们可以进去AsyncCall类看下 先上图!!!
一个短小而精悍的类可以从上图看出它是继承NameRunnerble的 前面这个方法的参数需要的是一个Runnable类 然而从上面的图片可以看出 好像并没有返回Runnable 所以我们从它继承的NameRunnerble 里面先看下 老规矩 上图!
可以看到它是一个抽象类并且实现了Runnable接口 这就解释了为啥要传入这个类了(自己百度多线程的两种创建方式) 并且在Run方法里面执行了execute这个抽象方法(这个就是一个关键点)
我们再回到前面AsyncCall类中去 看见它实现了这个方法
这个方法可以看到 它从getResponseWithInterceptorChain()中获取了一个Response类 然后判断RetryAndFollowUpInterceptor这个拦截器(这个拦截器它的作用主要是负责请求的重定向操作,用于处理网络请求中,请求失败后的重试机制 这个可能后面写的博客会分析 So 我们暂时不关注 )是否被取消 如果被取消我们就调用Callback中的OnFailure方法 并返回一个异常 signalledCallback 并且把 这个标志设置为true 否则 我们就返回这个请求的response 如果捕获到了异常 且signalledCallback为true 打印日志 相反则通知eventListener 这个监听请求失败 并且返回原因 同样也调用responseCallback的onFailure方法 一样的操作 最终执行dispatcher的finished方法 我们可以进这个方法看下 老规矩 先上图!!
可以看出这个方法最终是执行了 Runnable的 Run方法 好了 这次分析就到此为止 我们下一篇分析再见!!!