Java定时器系列一之你最容易忽略的定时器

Timer介绍

TimerJDK自带的一种最为简单的定时器实现.
Timerjava.util包中,最好出现在jdk1.3
线程的工具,用于在后台线程中安排将来执行的任务。 可以将任务安排为一次性执行,或者以固定间隔重复执行

每一个Timer对象对应的是一个线程。当定时任务都执行完成后,计时器的任务执行线程会正常终止,但是这可能会发生在任意长的时间内。默认情况下,任务执行线程不作为守护线程运行,因此它能够阻止应用程序终止.如果想要快速终止,可以调用计时器的cancel方法。

注意: Timer类是线程安全的。
但是这个类不提供实时保证,它是使用的Object.wait()来实现的调度任务.
jdk1.5之后,并发包中提供了一个 ScheduledThreadPoolExecutor 类,这个其实是Timer组合的通用的替代品。它允许多个服务线程,接收不同的时间单位,并不需要TimerTask.
ScheduledThreadPoolExecutor见下一篇文章.

Timer能实现以下几种语义:

  • 1.隔多久执行一次(只执行一次)
  • 2.指定时间执行一次(只执行一次)
  • 3.隔多久之后开始执行,每隔多久之后执行一次。
  • 4.指定时间执行,每隔多久执行一次
  • 5.隔多久之后开始执行,以相同的速率执行
  • 6.在指定的时候之后开始执行,以相同的速率执行

隔多久执行一次(只执行一次)

/**
 * 仅在5秒后执行一次,然后退出
 */
public void demo1() {
    System.out.println("demo1开始执行.");
    Timer demo3 = new Timer("demo1");
    demo3.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println(Instant.now().getEpochSecond() + "   demo1..执行了。。。");
        }
    }, new Date(System.currentTimeMillis() + 5000));
    demo3.cancel();
}

指定时间执行一次(只执行一次)

/**
 * 仅在指定的日期上执行一次
 */
public void demo2() {
    System.out.println("demo1开始执行.");
    Timer demo2 = new Timer("demo1");
    demo3.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println(Instant.now().getEpochSecond() + "   demo2..执行了。。。");
        }
    }, new Date(System.currentTimeMillis() + 5000));
    demo2.cancel();
}

隔多久之后开始执行,每隔多久之后执行一次。

/**
 * 5s后执行一次,然后每隔1s执行一次
 */
public void demo3() {
    System.out.println("demo3开始执行.");
    new Timer("demo3",false).schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println(Instant.now().getEpochSecond() + "   demo3..执行了。。。");
        }
    }, 5000, 1000);
}

指定时间执行,每隔多久执行一次

/**
 * 指定的时间上执行一次,然后每隔1s执行一次
 */
public void demo4() {
    System.out.println("demo4开始执行.");
    new Timer("demo4",false).schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println(Instant.now().getEpochSecond() + "   demo4..执行了。。。");
        }
    }, new Date(System.currentTimeMillis() + 5000), 1000);
}

隔多久之后开始执行,以相同的速率执行

    /**
     * 5s后执行一次,然后每隔1s执行一次
     */
    public void demo5() {
        System.out.println("demo5开始执行.");
        new Timer("demo5",false).scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Instant.now().getEpochSecond() + "   demo5..执行了。。。");
            }
        }, 5000, 1000);
    }

在指定的时候之后开始执行,以相同的速率执行

    /**
     * 指定时间后执行一次,然后每隔1s执行一次
     */
    public void demo6() {
        System.out.println("demo6 开始执行.");
        new Timer("demo6",false).scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Instant.now().getEpochSecond() + "   demo6..执行了。。。");
            }
        }, new Date(System.currentTimeMillis() + 5000), 1000);
    }

小结

  • Timerjdk自带的,基于Object.wait()实现的定时器,线程安全的.
  • JDK1.5之后,建议使用 ScheduledThreadPoolExecutor.
  • 主要有两种API Timer.schedule()Timer.scheduleAtFixedRate()
posted @ 2019-09-08 07:57  方家小白  阅读(15)  评论(0编辑  收藏  举报