Timer定时任务相关:
情景1:定时任务执行时间为当前运行程序启动10秒之后
1 import java.util.Date; 2 import java.util.TimerTask; 3 4 /** 5 * 定时任务类,继承TimerTask类 6 */ 7 public class MyTask extends TimerTask { 8 9 @Override 10 public void run() { 11 System.out.println("任务执行,时间为:" + new Date()); 12 } 13 }
1 import java.util.Calendar; 2 import java.util.Date; 3 import java.util.Timer; 4 5 public class Test { 6 /** 7 * 通过测试结果可以看出任务执行了,但是执行完之后当前进程并没有销毁 8 * 因为创建Timer的时候,启动了一个新的线程,并且这个线程并不是守护线程,一直在运行 9 */ 10 public static void main(String[] args) { 11 System.out.println("当前时间为:" + new Date()); 12 Calendar calendar = Calendar.getInstance(); 13 calendar.add(Calendar.SECOND, 10); 14 MyTask task = new MyTask(); 15 Timer timer = new Timer(); 16 timer.schedule(task, calendar.getTime()); 17 } 18 }
运行结果如下:
情景2:创建的Timer为守护线程,解决上面进程不销毁的情况
1 import java.util.Date; 2 import java.util.TimerTask; 3 4 /** 5 * 定时任务类,继承TimerTask类 6 */ 7 public class MyTask extends TimerTask { 8 9 @Override 10 public void run() { 11 System.out.println("任务执行,时间为:" + new Date()); 12 } 13 }
1 import java.util.Calendar; 2 import java.util.Date; 3 import java.util.Timer; 4 5 public class Test { 6 /** 7 * 通过测试结果可以看出程序运行后迅速结束当前的进程, 8 * 而此时TimerTask中的任务还没被执行(因为进程已经结束了) 9 */ 10 public static void main(String[] args) { 11 System.out.println("当前时间为:" + new Date()); 12 Calendar calendar = Calendar.getInstance(); 13 calendar.add(Calendar.SECOND, 10); 14 Date runDate = calendar.getTime(); 15 MyTask task = new MyTask(); 16 Timer timer = new Timer(true);//设置创建的Timer为守护线程 17 timer.schedule(task, runDate); 18 } 19 }
运行结果如下:
情景3:执行任务的时间早于当前时间
1 import java.util.Date; 2 import java.util.TimerTask; 3 4 /** 5 * 定时任务类,继承TimerTask类 6 */ 7 public class MyTask extends TimerTask { 8 9 @Override 10 public void run() { 11 System.out.println("任务执行,时间为:" + new Date()); 12 } 13 }
1 import java.util.Calendar; 2 import java.util.Date; 3 import java.util.Timer; 4 5 public class Test { 6 /** 7 * 通过测试结果可以看出如果执行任务的时间早于当前时间,则任务立刻被执行 8 */ 9 public static void main(String[] args) { 10 System.out.println("当前时间为:" + new Date()); 11 Calendar calendar = Calendar.getInstance(); 12 //将执行任务的时间提前10秒 13 calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND)-10); 14 Date runDate = calendar.getTime(); 15 System.out.println("计划时间为:" + runDate); 16 MyTask task = new MyTask(); 17 Timer timer = new Timer(); 18 timer.schedule(task, runDate); 19 } 20 }
运行结果如下:
情景4:Timer运行有多个TimerTask任务及延时
1 import java.util.Date; 2 import java.util.TimerTask; 3 4 /** 5 * 定时任务类,继承TimerTask类 6 */ 7 public class MyTask extends TimerTask { 8 9 @Override 10 public void run() { 11 System.out.println("任务执行,时间为:" + new Date()); 12 } 13 }
1 import java.util.Calendar; 2 import java.util.Date; 3 import java.util.Timer; 4 5 public class Test { 6 7 /** 8 * Timer运行有多个TimerTask任务及延时 9 */ 10 public static void main(String[] args) { 11 System.out.println("当前时间为:" + new Date()); 12 13 Calendar calendar1 = Calendar.getInstance(); 14 calendar1.add(Calendar.SECOND, 10); 15 Date runDate1 = calendar1.getTime(); 16 System.out.println("计划时间:" + runDate1); 17 18 Calendar calendar2 = Calendar.getInstance(); 19 calendar2.add(Calendar.SECOND, 15); 20 Date runDate2 = calendar2.getTime(); 21 System.out.println("计划时间:" + runDate2); 22 23 MyTask task1 = new MyTask(); 24 MyTask task2 = new MyTask(); 25 26 Timer time = new Timer(); 27 time.schedule(task1, runDate1); 28 time.schedule(task2, runDate2); 29 } 30 }
运行结果如下:
情景5:TimerTask是以队列的方式一个一个被顺序的执行,所有执行的时间有可能和预期的时间不一致,因为前面的任务有可能消耗的时间较长,则后面的任务运行的时间也被拖延
1 import java.util.Date; 2 import java.util.TimerTask; 3 4 public class MyTaskA extends TimerTask { 5 6 @Override 7 public void run() { 8 try { 9 System.out.println("A begin timer:" + new Date()); 10 Thread.sleep(20000); 11 System.out.println("A end timer:" + new Date()); 12 } catch (InterruptedException e) { 13 e.printStackTrace(); 14 } 15 } 16 }
1 import java.util.Date; 2 import java.util.TimerTask; 3 4 public class MyTaskB extends TimerTask { 5 6 @Override 7 public void run() { 8 System.out.println("B begin timer:" + new Date()); 9 System.out.println("B end timer:" + new Date()); 10 } 11 }
1 import java.util.Calendar; 2 import java.util.Date; 3 import java.util.Timer; 4 5 public class Test { 6 7 /** 8 * TimerTask是以队列的方式一个一个被顺序的执行,所有执行的时间有可能和预期的时间不一致,因为前面的任务有可能消耗的时间较长,则后面的任务运行的时间也被拖延 9 */ 10 public static void main(String[] args) { 11 System.out.println("当前时间为:" + new Date()); 12 13 Calendar calendar1 = Calendar.getInstance(); 14 Date runDate1 = calendar1.getTime(); 15 System.out.println("A计划时间:" + runDate1); 16 17 Calendar calendar2 = Calendar.getInstance(); 18 calendar2.add(Calendar.SECOND, 10); 19 Date runDate2 = calendar2.getTime(); 20 System.out.println("B计划时间:" + runDate2); 21 22 MyTaskA task1 = new MyTaskA(); 23 MyTaskB task2 = new MyTaskB(); 24 25 Timer time = new Timer(); 26 time.schedule(task1, runDate1); 27 time.schedule(task2, runDate2); 28 } 29 }
运行结果如下:
情景6:schedule(TimerTask, Date runDate, long period) 在指定的日期之后按照指定的时间间隔无限循环的执行某一个任务
1 import java.util.Date; 2 import java.util.TimerTask; 3 4 public class MyTask extends TimerTask { 5 6 @Override 7 public void run() { 8 System.out.println("任务执行,时间为:" + new Date()); 9 } 10 }
1 import java.util.Calendar; 2 import java.util.Date; 3 import java.util.Timer; 4 5 /** 6 * schedule(TimerTask, Date runDate, long period) 7 * 在指定的日期之后按照指定的时间间隔无限循环的执行某一个任务 8 */ 9 public class Test { 10 /** 11 * 测试计划时间大于当前时间,程序运行之后,到达指定时间后开始执行任务,并且每4秒执行一次 12 */ 13 public static void main(String[] args) { 14 System.out.println("当前时间为:" + new Date()); 15 Calendar calendar = Calendar.getInstance(); 16 calendar.add(Calendar.SECOND, 10); 17 Date runDate = calendar.getTime(); 18 System.out.println("计划时间为:" + runDate); 19 MyTask task = new MyTask(); 20 Timer timer = new Timer(); 21 timer.schedule(task, runDate, 4000); 22 } 23 }
情景7:schedule(TimerTask, Date runDate, long period) 在指定的日期之后按照指定的时间间隔无限循环的执行某一个任务
1 import java.util.Date; 2 import java.util.TimerTask; 3 4 public class MyTask extends TimerTask { 5 6 @Override 7 public void run() { 8 System.out.println("任务执行,时间为:" + new Date()); 9 } 10 }
1 import java.util.Calendar; 2 import java.util.Date; 3 import java.util.Timer; 4 5 /** 6 * schedule(TimerTask, Date runDate, long period) 7 * 在指定的日期之后按照指定的时间间隔无限循环的执行某一个任务 8 */ 9 public class Test { 10 /** 11 * 测试计划时间小于当前时间,程序运行后立刻执行任务 12 */ 13 public static void main(String[] args) { 14 System.out.println("当前时间为:" + new Date()); 15 Calendar calendar = Calendar.getInstance(); 16 calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND)-10); 17 Date runDate = calendar.getTime(); 18 System.out.println("计划时间为:" + runDate); 19 MyTask task = new MyTask(); 20 Timer timer = new Timer(); 21 timer.schedule(task, runDate, 4000); 22 } 23 }
情景8:schedule(TimerTask, Date runDate, long period) 在指定的日期之后按照指定的时间间隔无限循环的执行某一个任务
1 import java.util.Date; 2 import java.util.TimerTask; 3 4 public class MyTaskA extends TimerTask { 5 6 @Override 7 public void run() { 8 try { 9 System.out.println("A begin timer:" + new Date()); 10 Thread.sleep(5000); 11 System.out.println("A end timer:" + new Date()); 12 } catch (InterruptedException e) { 13 e.printStackTrace(); 14 } 15 } 16 }
1 import java.util.Calendar; 2 import java.util.Date; 3 import java.util.Timer; 4 5 /** 6 * schedule(TimerTask, Date runDate, long period) 7 * 在指定的日期之后按照指定的时间间隔无限循环的执行某一个任务 8 */ 9 public class Test { 10 11 /** 12 * 测试任务执行时间被延时,从结果可以看出,任务被延时,并且还是得一个一个执行 13 */ 14 public static void main(String[] args) { 15 System.out.println("当前时间为:" + new Date()); 16 Calendar calendar = Calendar.getInstance(); 17 calendar.add(Calendar.SECOND, 10); 18 Date runDate = calendar.getTime(); 19 System.out.println("计划时间为:" + runDate); 20 MyTaskA task = new MyTaskA(); 21 Timer timer = new Timer(); 22 timer.schedule(task, runDate, 3000); 23 } 24 }
情景9:TimerTask类中的cancel()方法:将自身从任务队列中清除
1 import java.util.Date; 2 import java.util.TimerTask; 3 4 public class MyTaskA extends TimerTask { 5 6 @Override 7 public void run() { 8 System.out.println("A run timer:" + new Date()); 9 this.cancel();//移除当前任务 10 System.out.println("A任务自己移除了自己"); 11 } 12 }
1 import java.util.Date; 2 import java.util.TimerTask; 3 4 public class MyTaskB extends TimerTask { 5 6 @Override 7 public void run() { 8 System.out.println("B run timer:" + new Date()); 9 } 10 }
1 import java.util.Calendar; 2 import java.util.Date; 3 import java.util.Timer; 4 5 /** 6 * schedule(TimerTask, Date runDate, long period) 7 * 在指定的日期之后按照指定的时间间隔无限循环的执行某一个任务 8 */ 9 public class Test { 10 11 /** 12 * TimerTask类中的cancel()方法:将自身从任务队列中清除 13 */ 14 public static void main(String[] args) { 15 System.out.println("当前时间为:" + new Date()); 16 Calendar calendar = Calendar.getInstance(); 17 calendar.add(Calendar.SECOND, 10); 18 Date runDate = calendar.getTime(); 19 System.out.println("计划时间为:" + runDate); 20 MyTaskA task1 = new MyTaskA(); 21 MyTaskB task2 = new MyTaskB(); 22 Timer timer = new Timer(); 23 timer.schedule(task1, runDate, 4000); 24 timer.schedule(task2, runDate, 4000); 25 } 26 }
情景10:Timer类中的cancel()方法:将任务队列中的全部任务清空
1 import java.util.Date; 2 import java.util.TimerTask; 3 4 public class MyTaskA extends TimerTask { 5 6 @Override 7 public void run() { 8 System.out.println("A run timer:" + new Date()); 9 } 10 }
1 import java.util.Date; 2 import java.util.TimerTask; 3 4 public class MyTaskB extends TimerTask { 5 6 @Override 7 public void run() { 8 System.out.println("B run timer:" + new Date()); 9 } 10 }
1 import java.util.Calendar; 2 import java.util.Date; 3 import java.util.Timer; 4 5 /** 6 * schedule(TimerTask, Date runDate, long period) 7 * 在指定的日期之后按照指定的时间间隔无限循环的执行某一个任务 8 */ 9 public class Test { 10 11 /** 12 * Timer类中的cancel()方法:将任务队列中的全部任务清空 13 * 当使用Timer类中的cancel()方法时,不一定会停止任务, 14 * 因为cancel()方法有时并没有抢到queue锁,则任务会被正常执行 15 */ 16 public static void main(String[] args) { 17 try { 18 System.out.println("当前时间为:" + new Date()); 19 Calendar calendar = Calendar.getInstance(); 20 Date runDate = calendar.getTime(); 21 System.out.println("计划时间为:" + runDate); 22 MyTaskA task1 = new MyTaskA(); 23 MyTaskB task2 = new MyTaskB(); 24 Timer timer = new Timer(); 25 timer.schedule(task1, runDate, 2000); 26 timer.schedule(task2, runDate, 2000); 27 Thread.sleep(10000); 28 timer.cancel();//移除当前所有任务 29 } catch (InterruptedException e) { 30 e.printStackTrace(); 31 } 32 } 33 }
测试1:
1 import java.util.Date; 2 import java.util.Timer; 3 import java.util.TimerTask; 4 5 /** 6 * schedule(TimerTask,long delay): 7 * 以当前时间为参考,延迟指定时间后执行任务 8 */ 9 public class Test { 10 11 public static class MyTask extends TimerTask{ 12 @Override 13 public void run() { 14 System.out.println("执行任务,时间为:" + new Date()); 15 } 16 } 17 18 public static void main(String[] args) { 19 MyTask task = new MyTask(); 20 Timer timer = new Timer(); 21 System.out.println("当前时间为:" + new Date()); 22 timer.schedule(task, 4000); 23 } 24 }
测试2:
1 import java.util.Date; 2 import java.util.Timer; 3 import java.util.TimerTask; 4 5 /** 6 * schedule(TimerTask,long delay,long period): 7 * 以当前时间为参考,延迟指定时间后执行任务,并每隔指定时间循环执行 8 */ 9 public class Test2 { 10 11 public static class MyTask extends TimerTask{ 12 @Override 13 public void run() { 14 System.out.println("执行任务,时间为:" + new Date()); 15 } 16 } 17 18 public static void main(String[] args) { 19 MyTask task = new MyTask(); 20 Timer timer = new Timer(); 21 System.out.println("当前时间为:" + new Date()); 22 timer.schedule(task, 3000, 5000); 23 } 24 }