美文网首页
Java Timer TimerTask

Java Timer TimerTask

作者: yunhen | 来源:发表于2018-08-14 15:25 被阅读13次

https://blog.csdn.net/xieyuooo/article/details/8607220
栗子:

private void testUpdateFloatSpeed() {
        
        Timer timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                int speed = new Random().nextInt(200);
                sendUpdateFloatSpeed(speed+"");
            }
        };
        timer.schedule(timerTask,1000,1000);

    }

注意:
重置时调用cancel(), 赋值 null, 再次使用时要new


说明:

//  这个方法是调度一个task,经过delay(ms)后开始进行调度,仅仅调度一次。
public void schedule(TimerTask task, long delay)

//在指定的时间点time上调度一次。
public void schedule(TimerTask task, Date time)

// 这个方法是调度一个task,在delay(ms)后开始调度,每次调度完后,最少等待period(ms)后才开始调度。
public void schedule(TimerTask task, long delay, long period)

//和上一个方法类似,唯一的区别就是传入的第二个参数为第一次调度的时间。
public void schedule(TimerTask task, Date firstTime, long period)

调度一个task,在delay(ms)后开始调度,然后每经过period(ms)再次调度,貌似和方法:schedule是一样的,其实不然,后面你会根据源码看到,schedule在计算下一次执行的时间的时候,是通过当前时间(在任务执行前得到) + 时间片,而scheduleAtFixedRate方法是通过当前需要执行的时间(也就是计算出现在应该执行的时间)+ 时间片,前者是运行的实际时间,而后者是理论时间点,例如:schedule时间片是5s,那么理论上会在5、10、15、20这些时间片被调度,但是如果由于某些CPU征用导致未被调度,假如等到第8s才被第一次调度,那么schedule方法计算出来的下一次时间应该是第13s而不是第10s,这样有可能下次就越到20s后而被少调度一次或多次,而scheduleAtFixedRate方法就是每次理论计算出下一次需要调度的时间用以排序,若第8s被调度,那么计算出应该是第10s,所以它距离当前时间是2s,那么再调度队列排序中,会被优先调度,那么就尽量减少漏掉调度的情况。

//
public void scheduleAtFixedRate(TimerTask task, long delay, long period)

相关文章

网友评论

      本文标题:Java Timer TimerTask

      本文链接:https://www.haomeiwen.com/subject/ahdvbftx.html