OkHttp源码相关面试点

首先介绍下okhttp源码涉及到的几个类
  1. okhttpClient okhttp的大管家,负责初始化一些必要参数 拦截器 超时时间等。Builder模式来创建的。
  2. Request 负责构建一个请求对象,通过你传入的url,也是通过Builder模式来创建。Response 负责构建一个相应对象。
  3. RealCall 是Call接口的实现类,内部有同步发起请求和异步发起请求两种方式,realcall的enqueue方法最终会调用Dispater任务调度器的enqueue 方法
  4. Dispater 内部是线程池和两个队列,一个是存放等待发起请求的call对象,另一个是存放已经发起请求的call对象 线程池负责网络请求在子线程中执行。此类创建的线程池是核心线程数为0,线程闲置时间为60s,队列为同步队列,最大线程数为Integer.MAX的线程池。
  5. 各种interceptor,责任链模式,拦截处理请求,返回给下个拦截器,最终实现网络请求,拿到最终的response.
创建线程池对象的构造方法里几个参数,分别说一下

巴拉巴拉…

线程池中的队列的三种策略
  • LinkBlockingQueue 无界队列 ,超过核心线程数,任务就会加入到队列中,相当于控制了最大并发数。
  • ArrayBlockingQueue 有界队列,超出核心线程数,队列满了之后,如果未超过最大线程数,则继续创建线程,执行任务。
  • SynchronousQueue同步队列,任务不进入队列,直接创建线程执行,只要不超过最大线程数。超过就拒绝。
在okhttp的线程池里 有个核心线程数为0的线程池,最大线程数Integer.MAX,来任务时候是怎么处理的?

Dispater 类中enqueue方法,先判断是否达到了最大请求数64,或是相同的host是否达到上限5。如果没达到,通过线程池中去创建线程,执行请求。如果达到了,就把请求加入到请求队列中。等到有请求执行完成后会调用Dispater的finished()方法,把当前请求从队列中移除,finished方法又会调用promoteCalls方法(),此方法是控制线程池中线程个数的核心方法,他会根据当前正在执行的请求是否超过了设定的两个最大值的界限,如果没有超过的话,他会从readycall队列中取出请求,然后交给线程池去执行。

参考
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨三点的北京

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值