OkHttp3源码详解(六)Okhttp任务队列工作原理

  • 时间:
  • 浏览:0
  • 来源:5分PK10APP下载_5分PK10APP官方

2.1 图解

2.2 过程分析

android完成非阻塞式的异步请求的以前全是通过启动子守护进程的辦法 来补救,子守护进程执行完任务的以前通过handler的辦法 来和主守护进程来完成通信。无限制的创建守护进程,会给系统带来小量的开销。可能性在高并发的任务下,启用个守护进程池,都还后能 不断的复用底下不再使用和有效的管理守护进程的调度和数量的管理。就都还后能 节省系统的成本,有效的提高执行数率。

这里做了核心request的动作,并把失败和回复数据的结果通过responseCallback 回调到Dispatcher。执行操作完毕了以前不管不是异常还会进入到dispactcherfinished辦法 。

为了完成调度和复用,定义了另另二个队列分别用作等待英文队列和执行任务的队列。这另二个队列全是Dispatcher 成员变量。Dispatcher是另另二个控制执行,控制所有Call的分派和任务的调度、通信、清理等操作。这里只介绍异步调度任务。

以上完成了守护进程守护进程池的复用和守护进程的管理工作。

另另另二个实在这里对readyAsyncCalls 进行调度的。最终会在readyAsyncCalls 中通过remove操作把元素迭代取出并移除以前加入到runningAsyncCalls的执行队列中执行操作。ArrayDeque 是非守护进程安全的所以finished在调用promoteCalls 的以前全是synchronized块中执行的。执行等待英文队列守护进程当然的前提是runningAsyncCalls 守护进程数这样超上线,或者等待英文队列底下有等待英文的任务。

了解源码或使用过okhttp的都知道。 okttp的操作元是Call对象。异步的实现是RealCall.AsyncCall。而 AsyncCall是实现的另另二个Runnable接口。

所以Call本质所以 另另二个Runable守护进程操作元肯定是放到excutorService中直接启动的。

Call代用equeue辦法 的以前

2 守护进程池的复用和管理

辦法 中满足执行队列底下匮乏最大守护进程数maxRequests或者Call对应的host数目不超过maxRequestsPerHost 的以前直接把call对象直接推入到执行队列里,并启动守护进程任务(Call本质是另另二个Runnable)。或者,当前守护进程数很多,就把他推入到等待英文队列中。Call执行完肯定都还后能 在runningAsyncCalls 队列中移除这名守护进程。这样readyAsyncCalls队列中的守护进程在什么以前才会被执行呢。

追溯下AsyncCall 守护进程的执行辦法

1.1 引言

在这里call在runningAsyncCalls队列中被移除了,重新计算了目前正在执行的守护进程数量。或者调用了promoteCalls() 看来是来调整任务队列的,跟进去看下

原文链接:https://www.bbsmax.com/A/VGzlBLg85b/

1.2 Call对象

小结,Call在执行任务通过Dispatcher把单元任务优先推到执行队列里进行操作,可能性操作完成再执行等待英文队列的任务。

okhttp的守护进程池对象指在于Dispatcher类中。实例过程如下

1 概述

1.2 守护进程池ThreadPoolExecutor

在《okhttp连接池复用机制》文章中亲戚亲戚我们歌词 我们歌词 在缓存Connection连接的以前也是使用的Deque双端队列。这里同样的辦法 ,都还后能 方便在队列头再加元素,移除尾部的元素。