2.第二步创建 HashedWheelTime
ticksPerWheel,wheel 是刚好大于等于ticksPerWheel中最小的2的N次方 N是整数<br>
默认 512
创建work线程
3.创建timeout (1s后执行PrintTask#run方法)<br>
第一个timeout 创建时,启动worker线程,开始循环检测,并记录开始时间startTime
新创建timeout时不会计算加入到具体bucket中
worker作为HashedWheelTimer循环检测调度器,会将新创建的timeout添加到对应的bucket,<br>并周期性检测每个bucket取出到期(deadline)的timeout 执行对应的TimeTask<br>
waitForNextTick() 等待期间sleep,在sleep期间如果有timeout到期了,醒来在执行<br>
tickDuration 就控制着时间的精准度,值越小精准度越高,worker线程则越繁忙
dubbo中发送请求超时检测time中tickDuration=30毫秒
未到期但被取消的任务会放到 cancelledTimeouts集合中, worker线程周期性的执行do while方法会调用processCancelledTasks() 会从bucket中删除调对应的timeout<br>
worker线程执行 transferTimeoutsToBuckets() 将新创建的timeout根据deadline计算出remainingRounds几轮与idx 并加入到对应的bucket
bucket.expireTimeouts(deadline); 将到期的bucket中所有的timeout判断并进行超时处理,到期的timeout进行超时处理,即调用TimeTask的run方法
风险:TimeTask.run() 方法是阻塞同步执行的,如果某task执行时间过久则会阻塞Worker线程 进一步拖慢超时检测流程