abstract class TimerTask implements Runnable{...}
一、schedule多个任务计划执行
首先先来看一下Timer的最基本用法,schedule(TimerTask, Date),我们要先创建一个类继承TimerTask类,并重写run()方法,然后实例化这个类的对象,作为schedule(TimerTask, Date)方法的参数之一。另一个参数是我们需要TimerTask中任务执行的时间。另外,当两个任务都需要计划执行,并且是使用了同一个Timer实例,而第一个执行的任务有需要耗费较长的时间时,则第二个任务会延迟进行,当第一个任务执行后第二个任务马上开始执行,两个线程不会异步执行。
public class Run1 { private static Timer timer = new Timer(); static public class MyTask extends TimerTask{ @Override public void run() { try { System.out.println("任务1执行时间为:"+new Date()); Thread.sleep(5000); }catch(InterruptedException e) { e.printStackTrace(); } } } static public class MyTask1 extends TimerTask{ @Override public void run() { System.out.println("任务2执行时间为:"+new Date()); } } public static void main(String args[]) { try { MyTask mt = new MyTask(); MyTask1 mt1 = new MyTask1(); SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); String dateString = "2018-05-24 13:50:50"; String dateString1 = "2018-05-24 13:50:53"; Date dateRef = sdf.parse(dateString); Date dateRef1 = sdf.parse(dateString1); System.out.println("设置的时间:"+dateRef.toLocaleString()+" 设置的时间1:"+dateRef1.toLocaleString()+" 当前时间"+new Date().toLocaleString()); timer.schedule(mt, dateRef); timer.schedule(mt1, dateRef1); }catch(ParseException e) { e.printStackTrace(); } } }
执行结果如下:
/*
设置的时间:2018-5-24 13:50:50 设置的时间1:2018-5-24 13:50:53当前时间2018-5-24 13:49:28
任务1执行时间为:Thu May 24 13:50:50 CST 2018
任务2执行时间为:Thu May 24 13:50:55 CST 2018
*/
查看Timer类的jdk源码可以看到:
public Timer(String name) {
当我们实例化一个Timer的时候,实际上是将Timer类中的一个thread变量启动,这个线程会一直运行,并且在执行完相关的任务后依然继续运行下去。当我们使用Timer的构造方法Timer(boolean isDaemon)时,我们可以将这个线程设置为守护线程,这样thread就会提前结束,并且可能会在计划执行的任务还没开始执行前就结束。
ps:当设置计划时间早于当前时间时,任务立即执行。
二、其他方法介绍
实例代码如下:
public class Run2 { private static Timer timer = new Timer(); static public class MyTask extends TimerTask{ @Override public void run() { try { System.out.println("任务1执行时间为:"+new Date()); Thread.sleep(1000); }catch(InterruptedException e) { e.printStackTrace(); } } } public static void main(String args[]) { try { MyTask mt = new MyTask(); SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); String dateString = "2018-05-24 15:22:59"; Date dateRef = sdf.parse(dateString); System.out.println("设置的时间:"+dateRef.toLocaleString()+" 当前时间"+new Date().toLocaleString()); timer.schedule(mt, dateRef, 2000); }catch(ParseException e) { e.printStackTrace(); } } }
运行结果:
/*
设置的时间:2018-5-24 15:22:59当前时间2018-5-24 15:22:18
任务1执行时间为:Thu May 24 15:22:59 CST 2018
任务1执行时间为:Thu May 24 15:23:01 CST 2018
任务1执行时间为:Thu May 24 15:23:03 CST 2018
任务1执行时间为:Thu May 24 15:23:05 CST 2018
*/可以看到,指定的TimerTask任务每隔两秒执行一次,然后我们将代码中的Thread.sleep(1000)改为Thread.sleep(5000),运行结果如下:
/*
设置的时间:2018-5-24 15:20:59当前时间2018-5-24 15:20:59
任务1执行时间为:Thu May 24 15:20:59 CST 2018
任务1执行时间为:Thu May 24 15:21:04 CST 2018
任务1执行时间为:Thu May 24 15:21:09 CST 2018
任务1执行时间为:Thu May 24 15:21:14 CST 2018
任务的执行出现了延迟,时间间隔变为了5秒。