OkHttpClient入门
阻塞IO
callTimeout实现
实现类: AsyncTimeout.kt
核心实现方式:单向链表 + WatchDog线程
加入调度
核心方法: AsyncTimeout.scheduleTimeout()
请求发起前,会执行transmitter.timeoutEnter(),内部是timeout.enter()
AsyncTimeout内部有一个静态单向链表,链表的顺序即时超时的顺序
超时检测
核心方法: AsyncTimeout.awaitTimeout()
- 使用单个线程(WatchDog)循环检查链表头部是否超时,如果超时则执行
timeout方法 - 使用AQS精确控制超时时间,当在队列头部插入时,则立即唤醒WatchDog
- WatchDog等待时间最大60ms,最小为头部超时剩余时间,如果没有超时任务,WatchDog线程退出,下次任务加入调度时重新创建