Closed Alecyrus closed 3 years ago
@Auxxxxlx 谢谢关注!
你提到的 Stop 方式和相关注释,出现在 ScheduleTimer 示例中,是专门针对定时任务的。
定时任务目前是 自调度 的,大致流程为:
如果只调用一次 Stop() ,并且刚好在第 2 步和第 3 步之间,此时 timer 不在 bucket 中,于是 Stop() 会返回 false;此后第 3 步又会把 timer 重新加入时间轮,因此 timer 并不没有被 Stop。
Stop 定时任务的正确方式,在 ScheduleFunc 的文档中有简要说明。
我不明白为什么要用 for 循环去处理 t.Stop(), 按照 Stop() 的文档:
如果返回true,则 timer 被停止了,如果返回 false,则 timer 已经过期了或已经被停止了。我的理解是,无论返回true还是false,都说明这个周期任务已经不会被触发了,这是我单单只看这个Stop()文档的理解。
但是我仔细的读了下 Stop()的源码:
以上代码中,我的理解是,只要 timer 还可以取到 bucket, 那就要从 bucket 去 remove 这个 timer,直到 timer 无法取到 bucket (这就说明 这个timer已经从时间轮中被移出,对应的函数也不会再被触发了,也就是 停止成功, 返回 false),所以的确和上面的描述是一致的。。
然后我就看不懂这里为什么要加个 for 循环
然后注释说
since it will be restarted again and again.
, 如果 t.Stop() 返回 false 的话,那这里不就无限循环了,,为什么不直接t.Stop()
嘞,反正按照 Stop() 的逻辑,只要 Stop() 执行完了,t 就不会在fire了。所以我不太明白这里代码 for 循环的意义何在?希望大佬可以指导一下 @RussellLuo