如果代码无法按时完成会发生什么

Tat*_*tat 4 java timer

如果我设置一个计时器每3秒执行一次代码.如果代码没有在3秒内完成,会发生什么?计算机将终止代码或等待代码完成或继续计时器,并同时执行带有未完成代码的代码.

如果计算机将同时使用未完成的代码执行代码,那么如果变量涉及该方法会发生什么.例如,第一行可以执行i--,但最后一行是在执行i ++.如果它同时运行,当未完成的代码仍在运行,但是新的运行周期开始时,i值将被新的运行周期添加,所以当前一个周期运行到最后一行时,i值是否会出错(因为新的运行周期正在进行i--,在前一个代码完成之前).如果是,如何避免呢?

int delay = 0;   // delay for 0 sec.
int period = 3000;  // repeat 3 sec.
int i = 0;
Timer timer = new Timer();

timer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            i--;
            // Task here ...
            // It may take more than 3 sec to finish, what will happen?
            i++;
        }
    }, delay, period);
Run Code Online (Sandbox Code Playgroud)

seh*_*seh 5

每个Timer只使用一个线程来为其任务提供服务.计时器线程将运行您的任务,直到它完成,然后才尝试安排下一次执行.用于确认此问题的文档,Timer并警告其用户不要"聚集"任务.

一旦您的任务完成,管理Timer将尝试再次安排它.下一个计划的执行可能会在过去,每个Timer$TimerThread#mainLoop()的重新安排政策:它增加了任务的期限最后计划执行时间的任务.因为在您的情况下,计划的执行时间将在过去超过三秒,因此向其添加三秒仍会产生下一个计划的执行时间.

没关系; 该算法适应这种滑动.上次运行完成后,您的任务将立即再次运行.你不会得到的是你期望的每三秒一次的行为.相反,你会尽可能多地获得 - 但不是更频繁 - 而不是每三秒钟.