
1,AsyncTimeout
2-1,耗时段介绍「从上往下」
2-2,4个超时设置「OkHttpClient.Builder」
2-3,耗时 *** 作之间的关联
0,参考
okhttp Timeout 超时设置与用法解释: https://www.jianshu.com/p/7547a5e8524a
1,AsyncTimeout
AsyncTimeout.enter 案例
1,首次创建 Watchdog + AsyncTimeout作为static量,避免重复创建
2,单线程,设置超时,通过pine/pip机制,若超时通过写入流方式唤醒
2-1,耗时段介绍「从上往下」
耗时 *** 作调用位置
DNS解析 「ConnectInterceptor」streamAllocation.newStream
「RouteSelector」address.dns().lookup()
连接时间「ConnectInterceptor」streamAllocation.newStream
「Platform」socket.connect()
写入request 「CallServerInterceptor」httpCodec.writeRequestHeaders
服务器响应 「ConnectInterceptor」streamAllocation.newStream
「RealConnection」socket.connect()
读取response 「CallServerInterceptor」httpCodec.readResponseHeaders
2-2,4个超时设置「OkHttpClient.Builder」
api 简介 生效机制
callTimeout() 整个流程耗费的超时时间 RealCall.execute方法,设置进入
AsyncTimeout + WatchDog实现
connectTimeout()三次握手 + SSL建立耗时 socket.connect(address, connectTimeout)
readTimeout() source读取耗时 source.timeout(readTimeout)
AsyncTimeout + WatchDog实现
rawSocket读取耗时 rawSocket.setSoTimeout(readTimeout)
writeTimeout() sink写入耗时sink.timeout(writeTimeout)
AsyncTimeout + WatchDog实现
重点说一下,callTimeout这个参数,网络上很少人使用。这个就是整个网络流程的超时设置。
2-3,耗时 *** 作之间的关联
route.requiresTunnel() callTimeout = dns + connection + readTimeout + readTimeout + writeTimeout + 其它
无 callTimeout = dns + connectTime + readTimeout + 其它
1,基本耗时:dns + 三次握手耗时 + 服务器响应耗时
2,若有渠道,则增加 source.timeout().(readTimeout) + sink.timeout.(writeTimeout)
如果你是要在子线程超时后直接关闭的话可以这样:exec=Executors.newFixedThreadPool(1)
Callable<String>call = new Callable<String>() {
public String call() throws Exception {
//开始 *** 作
//TimeTaskTest.star(null)
return "线程执行完成"
}
}
Future<String>future = exec.submit(call)
//设置为30分钟超时
future.get(1000*60*time , TimeUnit.MILLISECONDS)
=========================================
如果你是在进行其他 *** 作的话那就比较麻烦了,目前我想到的是在子线程中一直访问某个变量,超时时守护线程改变这个值,然后子线程读到后退出,不过这个有个问题,就是当子线程卡死在某个环节时完全无用
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)