PowerMsg3 Local Server SDK 定时器优化:`scheduleWithFixDelay` 方法中使用 `compute` 的必要性
根据代码的逻辑,'timerKey2Timeouts.compute' 方法用于更新 'timerKey2Timeouts' 中的值,如果该键不存在则添加。而 'put' 方法则只是简单地添加一个新的键值对,如果该键已经存在,则会覆盖之前的值。因此,在 'scheduleWithFixDelay' 方法中,如果使用 'put' 方法进行替换,那么可能会导致某些定时任务的超时时间没有被更新,从而出现错误的定时行为。因此,建议仍然使用 'compute' 方法来更新 'timerKey2Timeouts' 中的值。
具体分析:
-
**
scheduleWithFixDelay方法的作用:**该方法用于设置一个定时任务,该任务会在初始延迟后开始执行,并且在每次执行完后都延迟固定时间再次执行。 -
**
timerKey2Timeouts的作用:**该ConcurrentHashMap用于存储定时任务的timerKey和对应的Timeout对象。 -
compute方法的作用:compute方法允许你对ConcurrentHashMap中的键值对进行操作,并在操作完成之后返回一个新的键值对。该方法的第一个参数是键,第二个参数是一个函数,该函数接受当前键值对(或null如果键不存在)并返回一个新的键值对。 -
put方法的作用:put方法简单地添加一个新的键值对到ConcurrentHashMap中。如果该键已经存在,则会覆盖之前的值。 -
**使用
put方法的风险:**在scheduleWithFixDelay方法中,使用put方法来更新timerKey2Timeouts中的值,会导致以下问题:- 如果某个定时任务的
timerKey已经存在于timerKey2Timeouts中,那么put方法会覆盖之前的值,导致该定时任务的超时时间被更新为新的值。 - 这会导致该定时任务的实际执行时间与预期时间不一致,从而出现错误的定时行为。
- 如果某个定时任务的
总结:
在 scheduleWithFixDelay 方法中,使用 compute 方法来更新 timerKey2Timeouts 中的值,可以避免使用 put 方法带来的风险,确保定时任务的正确执行。
代码示例:
// 使用 `compute` 方法更新 `timerKey2Timeouts` 中的值
timerKey2Timeouts.compute(timerKey, (key, timeout) -> {
tryCancel(timeout);
return scheduleWithTimerKey(initialDelay.toNanos(),
new ScheduledTimerTask(timerKey, delay.toNanos(), true, runnable, context));
});
// 使用 `put` 方法更新 `timerKey2Timeouts` 中的值(错误)
timerKey2Timeouts.put(timerKey, scheduleWithTimerKey(initialDelay.toNanos(),
new ScheduledTimerTask(timerKey, delay.toNanos(), true, runnable, context)));
原文地址: https://www.cveoy.top/t/topic/lIbe 著作权归作者所有。请勿转载和采集!