我有这种情况,我有一堆TimerTask对象,如下所示。为每个任务创建一个守护程序线程。我们开始注意到在一台机器上,任务没有按时运行,在我们深入挖掘之后,我们发现run()方法正在被延迟调用。
一个任务的情况是每四个小时运行一次,所以它按计划运行的第一天(8:00:00,12:00:00,4:00:00,等等),并且突然之后任务在(8:00:00,12:00:00,16:01:27,20:01:27,...)运行,然后在另一天(8:01: 27,12:01:27,16:03:33,20:03:33,...),那么是什么让JVM用这个时移来调用run()方法?
我进行了堆转储和一堆线程转储,任务的周期为14400000 MS,这意味着任务没有重新安排或任何事情,并且计时器的线程状态是" java .lang.Thread.State:TIMED_WAITING"在12:02:00,run方法在12:03:33被调用,但应该在12:00:00调用。
注1:任务执行时间从未超过20分钟。
注2:班次影响了所有正在运行的任务,因此应该在22:30:00运行的任务在第一班发生的那天22:31:27运行。
我觉得这可能是Timers和TimerTasks的问题,但我找不到任何地方提到的类似问题。
感谢。
Timer timer = new Timer(true);
//task here is he encapsulated TimerTask object.
timer.schedule(task, task.getStartDateTime(), task.getPeriod());