Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。
TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。具体的任务在TimerTask中run接口中实现。
通过Timer中的schedule方法启动定时任务。
一、运行定时器
启动一个定时器实质是启动一个线程
1、在指定日期运行定时器任务,只运行一次
public static void main(String[] args) throws ParseException { String sdate = "2018-02-14"; SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd"); Date date = sf.parse(sdate); Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("系统正在运行……"); } }, date); //在指定的日期运行一次定时任务 /*如果date日期在今天之前,则启动定时器后,立即运行一次定时任务run方法*/ /*如果date日期在今天之后,则启动定时器后,会在指定的将来日期运行一次任务run方法*/ }
2、在距当前时刻的一段时间后运行定时器任务,只运行一次
public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("系统正在运行……"); } }, 5000); //指定启动定时器5s之后运行定时器任务run方法,并且只运行一次 }
3、在指定的时间后,每隔指定的时间,重复运行定时器任务
1 public static void main(String[] args) throws ParseException { 2 String sdate = "2018-02-10"; 3 SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd"); 4 Date date = sf.parse(sdate); 5 6 Timer timer = new Timer(); 7 timer.schedule(new TimerTask() { 8 9 @Override 10 public void run() { 11 System.out.println("系统正在运行……"); 12 } 13 }, date, 2000); 14 /*如果指定的date时间是当天或者今天之前,启动定时器后会立即每隔2s运行一次定时器任务*/ 15 /*如果指定的date时间是未来的某天,启动定时器后会在未来的那天开始,每隔2s执行一次定时器任务*/ 16 }
4、在距当前时刻的一段指定距离后,每隔指定时间运行一次定时器任务
public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("系统正在运行……"); } }, 5000, 2000); /*当启动定时器后,5s之后开始每隔2s执行一次定时器任务*/ }
二、停止定时器
停止定时器实质是终止Timer的线程。默认情况下,创建的Timer线程会一直执行,如果要停止的话主要有以下四种方法终止Timer线程:
调用Timer的cancel方法;
把Timer线程设置成Daemon守护线程,当所有的用户线程结束后,那么守护线程也会被终止;
当所有的任务执行结束后,删除对应Timer对象的引用,线程也会被终止;
调用System.exit方法终止程序
举例用cancel方法终止Timer线程
public static void main(String[] args) throws InterruptedException { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("系统正在运行……"); // timer.cancel(); //可以在任何时刻调用cancel方法终止timer线程 } }, 5000, 2000); /*如果主线程不休眠一段时间,就执行了cancel方法,那么定时器还没来得及执行就会被关闭*/ Thread.sleep(6000); timer.cancel(); }
三、启动任务schedule 与 scheduleAtFixedRate的区别
1、schedule
public static void main(String[] args) throws ParseException { SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); Date date = sf.parse("2018-02-12 18:33:00"); Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println(new Date() + "系统正在运行……"); } }, date, 10 * 1000); }
2、scheduleAtFixedRate
1 public static void main(String[] args) throws ParseException { 2 SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); 3 Date date = sf.parse("2018-02-12 18:39:00"); 4 5 Timer timer = new Timer(); 6 timer.scheduleAtFixedRate(new TimerTask() { 7 8 @Override 9 public void run() { 10 System.out.println(new Date() + "系统正在运行……"); 11 } 12 }, date, 10 * 1000); 13 }