定时器是一种控制任务延时调用,或者周期调用的技术。
作用:闹钟、定时邮件发送。
定时器的实现方式:

  • 方式一:Timer
  • 方式二: ScheduledExecutorService

    Timer

    1. // 1、创建 Timer 定时器
    2. Timer timer = new Timer(); // 定时器本身就是一个单线程。
    3. // 2、调用方法,处理定时任务 延迟 1s 执行 每隔 2s 执行
    4. timer.schedule(new TimerTask() {
    5. @Override
    6. public void run() {
    7. System.out.println(Thread.currentThread().getName() + "执行 AAA~~~ " + new Date());
    8. }
    9. }, 1000, 2000);

    Timer 定时器的特点和存在的问题

  • Timer 是单线程,处理多个任务按照顺序执行,存在延时与设置定时器的时间有出入。

  • 可能因为其中的某个任务的异常使 Timer 线程死掉,从而影响后续任务执行。 ```java // 1、创建 Timer 定时器 Timer timer = new Timer(); // 定时器本身就是一个单线程。 // 2、调用方法,处理定时任务 timer.schedule(new TimerTask() { @Override public void run() {
      System.out.println(Thread.currentThread().getName() + " 执行 AAA ~~~ " + new Date());
      try {
          Thread.sleep(5000);
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
    
    } }, 0, 2000);

// 任务受到影响 timer.schedule(new TimerTask() { @Override public void run() { System.out.println(Thread.currentThread().getName() + “执行 BBB ~~~ “+ new Date()); } }, 0, 3000);

```java
// 1、创建 Timer 定时器
Timer timer = new Timer();  // 定时器本身就是一个单线程。
// 2、调用方法,处理定时任务
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 执行 AAA ~~~ " + new Date());
    }
}, 0, 2000);

// 任务的异常使 Timer 线程死掉
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 执行 BBB ~~~ "+ new Date());
        System.out.println(10/0);
    }
}, 0, 2000);

timer.schedule(new TimerTask() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "执行 CCC ~~~ "+ new Date());
    }
}, 0, 3000);

ScheduledExecutorService

// 1、创建 ScheduledExecutorService 线程池,做定时器
ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);

// 2、开启定时任务
pool.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 执行输出:AAA  ==> " + new Date());
        try {
            Thread.sleep(100000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}, 0, 2, TimeUnit.SECONDS);


pool.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 执行输出:BBB  ==> " + new Date());
        System.out.println(10 / 0);
    }
}, 0, 2, TimeUnit.SECONDS);


pool.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 执行输出:CCC  ==> " + new Date());
    }
}, 0, 2, TimeUnit.SECONDS);

基于线程池,某个任务的执行情况不会影响其他定时任务的执行。