Executors.newScheduledThreadPool执行中的差距

时间:2015-12-11 10:08:45

标签: java android multithreading timer scheduledexecutorservice

我有一个要求,我需要每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。与newCachedThreadPoolnewFixedThreadPoolnewSingleThreadScheduledExecutor一样。

我想做的就是每15秒执行一次任务&即使上一个任务需要很长时间才能完成或有任何异常,每次都执行它。

我怎样才能实现它?

1 个答案:

答案 0 :(得分:0)

Java并没有按时为您提供实时保障。我建议您记录工作的开始和结束时间。 scheduleAtFixedRate apidoc

有声明
  

如果执行此任务的时间超过其周期,则后续执行可能会延迟,但不会同时执行。

检查不是你的情况。

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,%20long,%20long,%20java.util.concurrent.TimeUnit)