编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

OKhttp线程模型(军训买豆腐块模型被)

wxchong 2024-09-25 22:48:27 开源技术 11 ℃ 0 评论

一、前言

本文基于okhttp的3.11.0版本中http2讲解线程模型

二、线程模型

2.1 异步请求

  • 如上当业务线程向okhttpclient投递一个任务请求后,client会先看当前激活任务个数是否到达最大值并且当前域名下的激活请求是否大于单个域名设置的最大并发数,如果大于则把任务提交到预备队列readyAsyncCalls(其是无界队列)中然后请求返回,否则把任务添加到激活队列runningAsyncCalls(其是无界队列)中,然后投递任务到线程池中执行。
  • 线程池中线程会执行提交的任务,也就是具体发起http请求,这里http2使用了多路复用方式,每个http2Connection链接可以开启多个stream公用一个连接来发送请求,其内部会维护所有streamid与对应的stream对象映射。线程池线程发起http请求后会被阻塞等待结果返回。每个http2Connection里会开启一个ReaderRunnable线程,用来轮询该http2Connection中每个stream中的响应结果(类似NIO中selector线程作用),然后激活阻塞的线程。
  • 当请求结果回来后会从runningAsyncCalls中移除当前任务,并且会把readyAsyncCalls中的任务移动到runningAsyncCalls中,并且投递到线程池。

2.2 同步请求

  • 同步不经过线程池,直接挂起当前调用线程。

三、总结

本文总结了okhttp中http2协议时候的线程模型,欢迎讨论。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表