okhttp任务调度核心类dispatcher解析
在之前已经对okhttp的同步和异步请求的流程进行了详细的分析,其中任务调度是由dispatcher来实现的,非常重要,所以这次专门来对它进行一个了解,带着问题去进行探究:
Q1:okhttp如何实现同步异步请求?
发送的同步 / 异步请求都会在dispatcher中管理状态。
Q2:到底什么是dispatcher?
dispatcher的作用为维护请求的状态,并维护一个线程池,用于执行请求。还是用一个图来大体感受一下,这个在之前也看过:
每当有请求来时则会将封装的Call对象通过Dispatcher推送到readyAsyncCalls就绪请求队列中,而Okhttp相对其它的网络请求框架高效在维护了一个线程池,能够更加高效的执行异步请求,下面还是来看一下Dispatcher的源码,先来看一下它里面定义的几个队列,这个在之前也已经看过了,但是由于它非常之重要所以再来温故一下:

Q3:异步请求为什么需要两个队列?
如下:

其实可以把Dispatcher理解成生产者-消费者模型,其Dispatcher为生产者,ExecutorService为消费者,所以此时就需要用二个队列来表示。
从同步异步请求中再来分析dispatcher:
同步请求:



异步请求:



接着来看一下线程池是如何创建的:

那意味着如果来了20个并发请求,线程池中会创建20个线程,当在60s之后则相继关闭无用的线程。
Q4:Call执行完肯定需要在runningAsyncCalls队列中移除这个线程,那么readyAsyncCalls队列中的线程什么时候才会被执行呢?


所以此时就得看一下finished()方法了:


看一下它的具体实现:


其计算也比较简单:

okhttp任务调度核心类dispatcher解析的更多相关文章
- lucene原理及源码解析--核心类
马云说:大家还没搞清PC时代的时候,移动互联网来了,还没搞清移动互联网的时候,大数据时代来了. 然而,我看到的是:在PC时代搞PC的,移动互联网时代搞移动互联网的,大数据时代搞大数据的,都是同一伙儿人 ...
- Log4j源码解析--核心类解析
原文出处:http://www.blogjava.net/DLevin/archive/2012/06/28/381667.html.感谢上善若水的无私分享. 在简单的介绍了Log4J各个模块类的作用 ...
- junit源码解析--核心类
JUnit 的概念及用途 JUnit 是由 Erich Gamma 和 Kent Beck 编写的一个开源的单元测试框架.它属于白盒测试,只要将待测类继承 TestCase 类,就可以利用 JUnit ...
- 【Spring注解驱动开发】AOP核心类解析,这是最全的一篇了!!
写在前面 昨天二狗子让我给他讲@EnableAspectJAutoProxy注解,讲到AnnotationAwareAspectJAutoProxyCreator类的源码时,二狗子消化不了了.这不,今 ...
- 从字节码和JVM的角度解析Java核心类String的不可变特性
1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...
- Spring源码解析——核心类介绍
前言: Spring用了这么久,虽然Spring的两大核心:IOC和AOP一直在用,但是始终没有搞懂Spring内部是怎么去实现的,于是决定撸一把Spring源码,前前后后也看了有两边,很多东西看了就 ...
- Webwork 学习之路【03】核心类 ServletDispatcher 的初始化
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
- Webwork【03】核心类 ServletDispatcher 的初始化
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
- cesium核心类Viewer简介
1.简单描述Viewer Viewer类是cesium的核心类,是地图可视化展示的主窗口,cesium程序应用的切入口,扮演必不可少的核心角色. 官网的英文解析如下: A base widget fo ...
随机推荐
- 360再报丑闻,派遣黑客盗取ESET安全软件病毒库,法院已经介入调查
360再报丑闻,派遣黑客盗取ESET安全软件病毒库,联合法院已经介入调查.360于2019/3/10日通过非法途径试图盗取ESET安全软件100MB的病毒库,ESET立即反抗,360黑客电脑立即崩溃, ...
- 浪潮服务器NF84260M3安装Windows server 2012 R2 RAID配置
这里是已经做了RAID6,再做系统 浪潮服务器NF84260M3 U盘启动,光盘刻录 Windows server 2012 R2 镜像,地址:迅雷下载,ed2k://|file|cn_windows ...
- Mac终端 bash和zsh切换方法
切换到bash chsh -s /bin/bash 切换到zsh chsh -s /bin/zsh 终端重启后生效
- 第5章:Linux系统管理
1.文件读写 1).Python内置的open函数 f = open('data.txt', 'w') f.write('hello, world') f.close() 2).避免文件句柄泄露 tr ...
- JS执行顺序问题
JavaScript执行引擎并非一行一行地分析和执行程序,而是一段一段地分析执行的.而且在分析执行同一段代码中,定义式的函数语句会被提取出来优先执行.函数定义执行完后,才会按顺序执行其他代码. 先看看 ...
- dotnet跨平台 - 使用Nginx+Docker Compose运行.NETCore项目
参考文档: https://docs.docker.com/install/linux/docker-ce/centos/ http://www.dockerinfo.net/document htt ...
- vue 通过 name 和 params 进行调整页面传参刷新参数丢失问题&vue路由可选参数
vue 通过 name 和 params 进行调整页面传参刷新参数丢失问题 router.js: export default new Router({ routes: [ { path: '/', ...
- 2.JVM、JRE、JDK之间的关系
诠释一. JDK(java development kit) JDK是Java开发工具包,是整个Java的核心,包括了Java运行环境JRE.Java工具和Java基础类库. JRE(java run ...
- jumperver源码理解以及部分修改
一 admin后台处理以及展示修改 jumpserver 默认不开放admin后台(获取是我没用使用正确的打开方式,) 打开方式 找到程序的入口 urls.py 修改,另外主要看下settin ...
- Mac上使用sunlogin向日葵软件远程控制电脑
1 安装软件 控制端和客户端都安装 https://sunlogin.oray.com/personal/download/ 2 再两台电脑上都安装好客户端和控制端后,打开控制端软件 可以看到自己登录 ...