我有一个要求,我需要每15秒运行一次任务。
我见过几篇建议使用ScheduledExecutorService
而不是TimerTask
的文章。
Runnable runnable = new Runnable() {
@Override
public void run() {
//Some task
}
};
ScheduledExecutorService scheduler = Executors
.newScheduledThreadPool(5);
scheduler
.scheduleAtFixedRate(runnable, 0, 15000, TimeUnit.MILLISECONDS);
问题是 runnable在随机之间不执行,有时可能持续1 ... 2..5分钟。
我有我的尝试捕获,没有异常或错误。
我添加了日期时间日志
时间2:2015-12-10T11:28:00.000 + 04:00
时间2:2015-12-10T11:28:00.000 + 04:00
time2:2015-12-10T11:29:00.000 + 04:00
time2:2015-12-10T11:31:00.000 + 04:00
time2:2015-12-10T11:31:00.000 + 04:00
正如您所见,runnable未在11:30执行
为什么跳过这个?计时器每次都在执行相同的任务。我认为上一个任务的延迟不太可能导致这种延迟。
我尝试将池大小从1增加到5,但结果仍然相同。
如果这是一个线程问题......我知道我有一些可以使用的选项,而不是newScheduledThreadPool
。与newCachedThreadPool
,newFixedThreadPool
,newSingleThreadScheduledExecutor
一样。
我想做的就是每15秒执行一次任务&即使上一个任务需要很长时间才能完成或有任何异常,每次都执行它。
我怎样才能实现它?
答案 0 :(得分:0)
Java并没有按时为您提供实时保障。我建议您记录工作的开始和结束时间。 scheduleAtFixedRate apidoc
有声明如果执行此任务的时间超过其周期,则后续执行可能会延迟,但不会同时执行。
检查不是你的情况。