天天看点

Java定时任务java.util.Timer.Timer和java.util.TimerTask详解

1.java.util.TimerTask类
  • 可由一个定时器进行一次或多次执行的任务。
  • scheduledExecutionTime方法返回任务最近执行的时间
  • cancel方法是停止任务执行
public static void main(String[] args) {
        timer = new Timer();
        TimerTask task = new TimerTask() {

            @Override
            public void run() {
                GGLogger.info("定时任务清空用户缓存信息数量为=========>>"+CacheUtil.size());
                CacheUtil.clear();
                System.out.println(DateFormatUtils.format(this.scheduledExecutionTime(), "yyyy-MM-dd HH:mm:ss"));
                this.cancel();
            }
        };
        timer.schedule(task, , *);
    }
           
2.java.util.Timer
  • Timer用于在后台线程中为将来执行任务调度任务的工具类,任务可以被调度执行一次、或者定期执行重复执行。
  • 每个定时器对象对应的是一个用于执行所有定时器任务的单个后台线程;按照顺序,定时任务应该很快可以执行完成。如果定时器花费了过多的时间来执行一个任务,他就会占用定时器的任务执行线程,这反过来又会延迟后续任务的执行,而后续任务可能会聚集起来,最终快速的执行完成。
  • 在对Timer对象的上一次实时引用消失并且所有未完成的任务都已完成执行之后,计时器的任务执行线程优雅地终止(并且成为垃圾收集的对象)。默认情况下,任务执行线程不作为守护进程线程运行,因此能够防止应用程序终止。如果调用方希望快速终止计时器的任务执行线程,则调用方应调用计时器的取消方法。
  • 如果定时器的任务执行线程意外终止,例如,因为调用了定时器的停止方法,任何进一步尝试在定时器上调度任务的尝试都将导致IllegalStateException,就像调用了定时器的取消方法一样。
  • 这个类是线程安全的:多个线程可以共享单定时器对象,而不需要外部同步。
/**
         * task:要调度的任务
         * delay:在执行任务之前,以毫秒为单位进行延迟的时间
         * period:连续任务以毫秒为单位的时间间隔
         */
        public void schedule(TimerTask task, long delay, long period) 
           
/**
         * task:要调度的任务
         * delay:在执行任务之前,以毫秒为单位进行延迟的时间
         */
        public void schedule(TimerTask task, long delay)
           
/**
         * task:要调度的任务
         * firstTime:第一次执行任务的时间
         * period:连续任务以毫秒为单位的时间间隔
         */
        public void schedule(TimerTask task, Date firstTime, long period)
           
/**
         * task:要调度的任务
         * firstTime:第一次执行任务的时间
         */
        public void schedule(TimerTask task, long delay)
           
/**
         * task:要调度的任务
         * delay:在执行任务之前,以毫秒为单位进行延迟的时间
         * period:连续任务以毫秒为单位的时间间隔
         */
        public void scheduleAtFixedRate(TimerTask task, long delay, long period)
           
/**
         * task:要调度的任务
         * firstTime:第一次执行任务的时间
         * period:连续任务以毫秒为单位的时间间隔
         */
        public void scheduleAtFixedRate(TimerTask task, Date firstTime,long period)
           

schedule和scheduleAtFixedRate方法的区别

这两个方法都是任务调度方法,他们之间区别是,schedule会保证任务的间隔是按照定义的period参数严格执行的,如果某一次调度时间比较长,那么后面的时间会顺延,保证调度间隔都是period,而scheduleAtFixedRate是严格按照调度时间来的,如果某次调度时间太长了,那么会通过缩短间隔的方式保证下一次调度在预定时间执行。举个栗子:你每个3秒调度一次,那么正常就是0,3,6,9s这样的时间,如果第二次调度花了2s的时间,如果是schedule,就会变成0,3+2,8,11这样的时间,保证间隔,而scheduleAtFixedRate就会变成0,3+2,6,9,压缩间隔,保证调度时间。