当前位置: 首页 > 知识库问答 >
问题:

java中意外触发的计时器

仰经武
2023-03-14

我用固定速率启动计时器。当用户更改系统时间时,此时任务将连续执行。它没有考虑时段。如何管理。

timer.scheduleAtFixedRate(task, delay, period);

注:现在系统时间为当前时间。周期为30秒。现在用户将系统时间从当前时间改为10分钟后。当时计时器任务不考虑周期。在一秒钟内,它执行了20次任务。

当我使用

 timer.schedule(task, delay, period);

而不是

timer.scheduleAtFixedRate(task, delay, period);

任务工作正常。如果我将系统时间更改为10分钟过去的时间,从现在起任务不会执行。。。

如何解决这个问题(

共有1个答案

萧伟兆
2023-03-14

看看这个堆栈溢出的答案;长话短说,使用timeduleAtFixedATE将您计划的任务排队,并相对于任务第一次排队的系统时间触发它们;如果有任何事情会延迟这些任务的触发,它们将播放“追赶”并尽可能快地触发。因此,在您的示例中,将系统时间更改为10分钟如何使事件触发20次,因为给定您的周期为30秒(1m/2=30,10m*2=20个事件)。

使用调度功能也有类似的问题,只是它不起“追赶”作用;如果您将计时器设置为每30秒触发一次,则将系统时间更改为10分钟-仅在计时器启动后10秒,您的第一个事件将触发,然后继续等待30秒延迟并再次触发(除非您再次更改系统时钟)。

如果你想要独立于系统时间的东西,你需要单调的时钟值。据我所知,Java API不直接包含任何单调计时器(出于多种原因),但这并不会阻止您自己实现一个计时器(尽管在自定义计时器类代码中可能会浪费执行时间)。这里有一个关于堆栈溢出的问题,以及一个关于它的谷歌小组讨论帖子。

如果您真的很难使用单调计时器,您可以使用POSIX API并做一些Java-

我希望这能有所帮助(至少指向一个坚实的方向)。

 类似资料:
  • 我的计时器任务没有正常工作。我计划每3秒钟重复一次特定的任务,但这并没有发生。 根据Java文件: 计划(TimerTask任务、长延迟、长周期)。将指定的任务安排为重复的固定延迟执行,从指定的延迟后开始。随后的执行大约按规定的时间间隔定期进行。 但我只有一个“新任务!!!!”控制台打印 我是不是遗漏了什么? 谢谢 更新: 我将尝试在这里粘贴每一段相关的代码,从上到下执行。 开始:

  • 我在Azure上有一个函数,包含以下function.json文件: 除非我错了,否则这个函数应该每天运行一次,在凌晨3点? 这是函数的签名: 我到底做错了什么?当我手动触发(在门户中单击“运行”)时,该功能工作正常,但它在今天凌晨3点没有运行,昨天也没有运行。 编辑:所以,正如建议的那样,我已经将计划更改为付费计划,并且我选择了一个动态计划。日志仍然没有说明功能在今天早上3点被激活。

  • 因此,基本上,当为时,即第一次,应在20秒内触发,并将设置为。从下一次开始,它应该每隔5秒就会被发射一次。 我面临的问题是,每次被激发时,输出中只有一条消息。也就是说,我在20秒后收到一条消息,每5秒收到一条消息。我希望在每次触发的输出中有20条消息。 如果我使用并创建一个五秒的时间窗口,则每5秒输出20条消息。请帮我把这个代码弄对。我是不是缺了什么?

  • userNotesTable: 用户提醒表: 插入触发器: 更新触发器: 这是数据库的当前代码,以及提醒表的特定触发器。我遇到的困难是,从提醒表中的specific中的user notes表中选择特定的名称和额外的内容,所有这些都在更新触发器中。 插入时,和会被插入到提醒和搜索表中,但我希望能够使用特定名称和用户注释表中的额外内容更新搜索表,这可能吗?

  • 在用户任务上应用边界计时器事件,在服务任务上添加java类属性,但当计时器到期触发异常列表时,会抛出,即无法找到分配给服务任务的类。类存在于类路径上。activiti配置中还启用了asyncExecutorActivate属性 这里有一个代码 例外 Bean初始化

  • 我们有一个quartz应用程序可以在其他环境中很好地工作。 触发器表也显示它从未被激发。 NEXT_FIRE_TIME PREV_FIRE_TIME优先级TRIGGER_STATE TRIGGER_TYPE START_TIME END_TIME CALENDAR_NAME MISFIRE_INSTR 1405630189133-1 5等待CRON 1405624813000 0 140 5630