【Java多线程】――定时器Timer的使用

匿名 (未验证) 提交于 2019-12-02 21:53:52














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秒。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!