bie*_*ior 3 java scheduler akka playframework-2.0
我有一个简单的调度程序,每1秒重复一次任务:
Cancellable task = Akka.system().scheduler().schedule(
Duration.create(0, TimeUnit.MILLISECONDS),
Duration.create(1, TimeUnit.SECONDS),
actor, new TickMsg("Tick", 0, 120)
);
Run Code Online (Sandbox Code Playgroud)
不幸的是,每次传递都是迟到的,ticker-duration所以最终演员在100毫秒之后收到TickMsg - 好的,这在文档中描述并且我很清楚:
它不会在确切的时间执行任务,但在每个滴答声中,它将运行过期的所有内容.
我无法理解的是为什么每一次传球都迟到了,事实上这意味着每次传球1000ms需要1100ms.在10次通过后的结果我们有1秒延迟,1分钟后6秒,1小时后6分钟等...
一些解决方案是将重复持续时间设置得稍短一些,因此在所需的时间点不会迟到,对于一个有效的示例,然后调度程序会根据需要重复执行任务:
Cancellable task = Akka.system().scheduler().schedule(
Duration.create(0, TimeUnit.MILLISECONDS),
Duration.create((1000 - tickerDuration/2), TimeUnit.MILLISECONDS),
actor, new TickMsg("Tick", 0, 120)
);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种方式有点不舒服,容易忘记,有没有其他方法每x秒(或其他TimeUnit)重复任务而不将其转换为毫秒和缩短?