关于定时器Timer类的使用

关于定时器Timer类:

1、定时器的作用

间隔特定的时间,执行特定的程序。


2、在实际开发中,每隔一定的时间执行一段特定的程序,这种需求是很常见的, 那么在java中其实可以采用多种方式实现。

(1)可以使用Thread.sleep()方法,睡眠,设置好休眠的时间, 在特定的时间醒来,这种方式是最原始的定时器,比较低级。

(2)在java的类库中已经写好了一个定时器:java.util.Timer,可以直接拿来用。

不过,这种方式在目前的开发中也很少用,因为现在有很多高级框架都是支持定时任务的。

(3)目前使用较多的是Spring框架中提供的SpringTask框架。 这个框架只要进行简单的配置,就可以完成定时器的任务。


3、不管是什么框架的定时器,它的实现原理一般都是采用java.util.Timer实现的,所以有必要学习一下Timer这个类。

测试代码:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Test12 {
          
   
    public static void main(String[] args) {
          
   

        // 创建定时器对象
        Timer timer = new Timer();
        //Timer timer1 = new Timer();  // 设置成守护线程的方式

        // 指定定时任务
        //timer.schedule(TimerTask task, Date firestTime, long period);  // 三个参数:定时任务,第一次执行时间,间隔的毫秒数

        // 先指定第一次执行时间,假设为:2020-7-25 10:17:20
        // 获取时间对象
        String str = "2020-7-25 10:17:20";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date firstTime = null;
        try {
          
   
            firstTime = sdf.parse(str);
        } catch (ParseException e) {
          
   
            e.printStackTrace();
        }

        // 假设每5秒执行一次
        long period = 5 * 1000L;

        /*
            再来看第一个参数,第一个参数的类型为TimerTask,这是一个抽象类,不能实例化的。
            这个TimerTask抽象类已经实现了Runnable接口,是一个线程运行类。
            而这个TimerTask抽象类并没有子类,要求我们自己去写一个子类,继承TimerTask类,并重写抽象方法。
        */

        // 创建TimeTask对象
        TimerTask task = new MyTask();

        // 三个参数已经凑齐,开始执行定时任务
        timer.schedule(task, firstTime, period);

        // 也可以采用匿名内部类,直接new抽象类
        /*
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                // 任务代码块
            }
        }, firstTime, 5000L);
         */

    }
}

// 定义一个指定任务的类,继承TimerTask抽象类
class MyTask extends TimerTask {
          
   

    @Override
    public void run() {
          
   
        Date nowTime = new Date();
        System.out.println(Thread.currentThread().getName() + ":" + nowTime);
    }
}

经验分享 程序员 微信小程序 职场和发展