一、TimerTask类的cancel方法
该方法的cancel作用是将自身从任务队列中进行清除

package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run8 { public static void main(String[] args) { System.out.println("当前时间 "+new Date()); Calendar calendar = Calendar.getInstance(); Date time= calendar.getTime(); System.out.println("计划执行时间 "+time); MyTask8A myTask1 = new MyTask8A(); MyTask8B myTask2 = new MyTask8B(); Timer timer = new Timer(); timer.schedule(myTask1,time,3000); timer.schedule(myTask2,time,3000); } }
当前时间 Thu Dec 12 22:55:50 CST 2019 计划执行时间 Thu Dec 12 22:55:50 CST 2019 MyTask8A run Thu Dec 12 22:55:50 CST 2019 MyTask8A 停了自己 Thu Dec 12 22:55:50 CST 2019 MyTask8B run Thu Dec 12 22:55:50 CST 2019 MyTask8B run Thu Dec 12 22:55:53 CST 2019 MyTask8B run Thu Dec 12 22:55:56 CST 2019 MyTask8B run Thu Dec 12 22:55:59 CST 2019 MyTask8B run Thu Dec 12 22:56:02 CST 2019
二、Timer类的cancel()
该方法作用是将任务队列中全部的任务进行清空

package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run8 { public static void main(String[] args) throws InterruptedException { System.out.println("当前时间 "+new Date()); Calendar calendar = Calendar.getInstance(); Date time= calendar.getTime(); System.out.println("计划执行时间 "+time); MyTask8A myTask1 = new MyTask8A(); MyTask8B myTask2 = new MyTask8B(); Timer timer = new Timer(); timer.schedule(myTask1,time,2000); timer.schedule(myTask2,time,2000); Thread.sleep(8000); timer.cancel(); } }
当前时间 Thu Dec 12 23:03:09 CST 2019 计划执行时间 Thu Dec 12 23:03:09 CST 2019 MyTask8A run Thu Dec 12 23:03:09 CST 2019 MyTask8B run Thu Dec 12 23:03:09 CST 2019 MyTask8B run Thu Dec 12 23:03:11 CST 2019 MyTask8A run Thu Dec 12 23:03:11 CST 2019 MyTask8A run Thu Dec 12 23:03:13 CST 2019 MyTask8B run Thu Dec 12 23:03:13 CST 2019 MyTask8B run Thu Dec 12 23:03:15 CST 2019 MyTask8A run Thu Dec 12 23:03:15 CST 2019 MyTask8A run Thu Dec 12 23:03:17 CST 2019
任务结束。
三、Timer类的cancel方法注意事项。
(一)Timer的cancel方法有时不一定会停止线程。
package com.it.po.thread12; import java.util.Date; import java.util.TimerTask; public class MyTask9 extends TimerTask{ private int i; public MyTask9(int i) { this.i = i; } @Override public void run() { System.out.println("第 " + i+ "次没有被cancel取消 "); } }
package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run9 { public static void main(String[] args) throws InterruptedException { int i=0; System.out.println("当前时间 "+new Date()); Calendar calendar = Calendar.getInstance(); Date time= calendar.getTime(); while (true){ i++; MyTask9 myTask1 = new MyTask9(i); Timer timer = new Timer(); timer.schedule(myTask1,time); timer.cancel(); } } }
当前时间 Thu Dec 12 23:12:20 CST 2019 第 17941次没有被cancel取消 第 17953次没有被cancel取消 第 17958次没有被cancel取消
原因是Timer类的cancel方法有时候并没有争抢到queue锁,则让TimerTask类
中的任务正常执行。
(二)、方法schedule(TimerTask task,long delay)
该方法的作用是以执行schedule(TimerTask task,long delay)
方法当前的时间为参考时间,在此时间基础上延迟指定的
毫秒数后执行一次TimerTask任务。
package com.it.po.thread12; import java.util.Date; import java.util.TimerTask; public class MyTask10 extends TimerTask{ @Override public void run() { System.out.println("执行任务时间 "+new Date()); } }
package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run10 { public static void main(String[] args) throws InterruptedException { MyTask10 myTask10 = new MyTask10(); Timer timer = new Timer(); System.out.println("当前时间 "+new Date()); timer.schedule(myTask10,5000);//在当前时间基础上延迟5s执行任务 } }
当前时间 Thu Dec 12 23:22:56 CST 2019 执行任务时间 Thu Dec 12 23:23:01 CST 2019

(三) 方法schedule(TimerTask task,long delay long period)
该方法的作用是以执行schedule(TimerTask task,long delay long period)
方法当前的时间为参考时间,在此时间基础上延迟指定的
毫秒数后,再以某一间隔时间无限次数地执行某一任务。
package com.it.po.thread12; import java.util.Date; import java.util.TimerTask; public class MyTask10 extends TimerTask{ @Override public void run() { System.out.println("执行任务时间 "+new Date()); } }
package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run10 { public static void main(String[] args) throws InterruptedException { MyTask10 myTask10 = new MyTask10(); Timer timer = new Timer(); System.out.println("当前时间 "+new Date()); //在当前时间基础上延迟2s,再3s执行一次任务 timer.schedule(myTask10,2000,3000); } }
当前时间 Thu Dec 12 23:27:54 CST 2019 执行任务时间 Thu Dec 12 23:27:56 CST 2019 执行任务时间 Thu Dec 12 23:27:59 CST 2019 执行任务时间 Thu Dec 12 23:28:02 CST 2019 执行任务时间 Thu Dec 12 23:28:05 CST 2019 执行任务时间 Thu Dec 12 23:28:08 CST 2019 执行任务时间 Thu Dec 12 23:28:11 CST 2019
。。。。
四、 方法scheduleAtFixedRate(TimerTask task, Date firstTime ,long period)
方法schedule和scheduleAtFixedRate都会按顺序执行,所以不要担心非线程
安全的问题。
方法schedule和scheduleAtFixedRate主要区别在于:没有追赶性
(一)schedule方法任务不延时--Date类型
package com.it.po.thread12; import java.util.Date; import java.util.TimerTask; public class MyTask11 extends TimerTask{ @Override public void run() { try { System.out.println("MyTask11 begin "+System.currentTimeMillis()); Thread.sleep(1000); System.out.println("MyTask11 end "+System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } }
package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run11 { public static void main(String[] args) { System.out.println("当前时间 "+new Date()); Calendar calendar = Calendar.getInstance(); Date time = calendar.getTime(); MyTask11 myTask1 = new MyTask11(); Timer timer = new Timer(); timer.schedule(myTask1,time,3000); } }
当前时间 Thu Dec 12 23:47:47 CST 2019 MyTask11 begin 1576165667683 MyTask11 end 1576165668683 MyTask11 begin 1576165670683 MyTask11 end 1576165671683 MyTask11 begin 1576165673683 MyTask11 end 1576165674683 MyTask11 begin 1576165676684 MyTask11 end 1576165677684
。。。
以上是不延时的特点。
(二)schedule方法任务不延时---long类型
上面的例子只需要修改main方法
package com.it.po.thread12; import java.util.Date; import java.util.TimerTask; public class MyTask11 extends TimerTask{ @Override public void run() { try { System.out.println("MyTask11 begin "+System.currentTimeMillis()); Thread.sleep(1000); System.out.println("MyTask11 end "+System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } }
package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run11 { public static void main(String[] args) { System.out.println("当前时间 "+new Date()); MyTask11 myTask1 = new MyTask11(); Timer timer = new Timer(); timer.schedule(myTask1,3000,4000); } }
当前时间 Thu Dec 12 23:52:30 CST 2019 MyTask11 begin 1576165953749 MyTask11 end 1576165954749 MyTask11 begin 1576165957750 MyTask11 end 1576165958750 MyTask11 begin 1576165961750 MyTask11 end 1576165962750 MyTask11 begin 1576165965750 MyTask11 end 1576165966750
(三)schedule方法任务延时--Date类型
package com.it.po.thread12; import java.util.Date; import java.util.TimerTask; public class MyTask12 extends TimerTask{ @Override public void run() { try { System.out.println("执行任务时间 begin "+System.currentTimeMillis()); Thread.sleep(5000); System.out.println("执行任务时间 end "+System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } }
package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run12 { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); Date time= calendar.getTime(); MyTask12 myTask = new MyTask12(); Timer timer = new Timer(); timer.schedule(myTask,time,2000); } }
执行任务时间 begin 1576250549052 执行任务时间 end 1576250554053 执行任务时间 begin 1576250554053 执行任务时间 end 1576250559053 执行任务时间 begin 1576250559053 执行任务时间 end 1576250564053
。。。
由于休眠5两秒循环一次偶读时间早过了,
(四)schedule方法任务延时--long类型
上面仅仅修改main方法
package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run12 { public static void main(String[] args) { MyTask12 myTask = new MyTask12(); Timer timer = new Timer(); timer.schedule(myTask,3000,2000); } }
执行任务时间 begin 1576250750263 执行任务时间 end 1576250755263 执行任务时间 begin 1576250755263 执行任务时间 end 1576250760263 执行任务时间 begin 1576250760263 执行任务时间 end 1576250765264 执行任务时间 begin 1576250765264 执行任务时间 end 1576250770284
休眠期间,延期时间已过
修改
public static void main(String[] args) { MyTask12 myTask = new MyTask12(); Timer timer = new Timer(); timer.schedule(myTask,6000,2000); }
执行任务时间 begin 1576250908409 执行任务时间 end 1576250913409 执行任务时间 begin 1576250913409 执行任务时间 end 1576250918409 执行任务时间 begin 1576250918409 执行任务时间 end 1576250923410
延时的情况下,如果执行任务的时间被延时,那么下一次任务的执行时间是以上一次任务
“ 结束 ” 时的时间作为参考的。
(五)scheduleAtFixedRate 方法任务不延时--Date类型
package com.it.po.thread12; import java.util.TimerTask; public class MyTask13 extends TimerTask{ @Override public void run() { try { System.out.println("执行任务时间 begin "+System.currentTimeMillis()); Thread.sleep(1000); System.out.println("执行任务时间 end "+System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } }
package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run13 { public static void main(String[] args) { MyTask13 myTask = new MyTask13(); Calendar instance = Calendar.getInstance(); Date time = instance.getTime(); Timer timer = new Timer(); timer.scheduleAtFixedRate(myTask,time,3000); } }
不延时的情况下,如果执行任务的时间没有被延时,
则下一次执行的时间是上一次任务的开始加period
执行任务时间 begin 1576251405369 执行任务时间 end 1576251406369 执行任务时间 begin 1576251408370 执行任务时间 end 1576251409370 执行任务时间 begin 1576251411370 执行任务时间 end 1576251412370 执行任务时间 begin 1576251414370 执行任务时间 end 1576251415370
。。。
(六)scheduleAtFixedRate 方法任务不延时--long类型
修改main方法即可
package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run13 { public static void main(String[] args) { MyTask13 myTask = new MyTask13(); System.out.println("当前时间 "+System.currentTimeMillis()); Timer timer = new Timer(); timer.scheduleAtFixedRate(myTask,3000,4000); } }
当前时间 1576251878746 执行任务时间 begin 1576251881749 执行任务时间 end 1576251882749 执行任务时间 begin 1576251885748 执行任务时间 end 1576251886748 执行任务时间 begin 1576251889748 执行任务时间 end 1576251890748
六、验证追赶性和不追赶性。
(一)、schedule
package com.it.po.thread12; import java.util.Date; import java.util.TimerTask; public class MyTask14 extends TimerTask{ @Override public void run() { System.out.println("MyTask14 begin "+new Date()); System.out.println("MyTask14 end "+new Date()); } }
package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run14 { public static void main(String[] args) { MyTask14 myTask = new MyTask14(); System.out.println("当前时间 "+System.currentTimeMillis()); Calendar instance = Calendar.getInstance(); instance.set(Calendar.SECOND,instance.get(Calendar.SECOND)-20); Date time = instance.getTime(); System.out.println("计划执行时间 "+time); Timer timer = new Timer(); timer.schedule(myTask,time,2000); } }
当前时间 1576253324578 计划执行时间 Sat Dec 14 00:08:24 CST 2019 MyTask14 begin Sat Dec 14 00:08:44 CST 2019 MyTask14 end Sat Dec 14 00:08:44 CST 2019 MyTask14 begin Sat Dec 14 00:08:46 CST 2019 MyTask14 end Sat Dec 14 00:08:46 CST 2019 MyTask14 begin Sat Dec 14 00:08:48 CST 2019 MyTask14 end Sat Dec 14 00:08:48 CST 2019 MyTask14 begin Sat Dec 14 00:08:50 CST 2019 MyTask14 end Sat Dec 14 00:08:50 CST 2019 MyTask14 begin Sat Dec 14 00:08:52 CST 2019 MyTask14 end Sat Dec 14 00:08:52 CST 2019 MyTask14 begin Sat Dec 14 00:08:54 CST 2019 MyTask14 end Sat Dec 14 00:08:54 CST 2019 MyTask14 begin Sat Dec 14 00:08:56 CST 2019 MyTask14 end Sat Dec 14 00:08:56 CST 2019 MyTask14 begin Sat Dec 14 00:08:58 CST 2019 MyTask14 end Sat Dec 14 00:08:58 CST 2019 MyTask14 begin Sat Dec 14 00:09:00 CST 2019 MyTask14 end Sat Dec 14 00:09:00 CST 2019 MyTask14 begin Sat Dec 14 00:09:02 CST 2019
Task任务不追赶
(二)、scheduleAtFixedRate
package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run14 { public static void main(String[] args) { MyTask14 myTask = new MyTask14(); System.out.println("当前时间 "+System.currentTimeMillis()); Calendar instance = Calendar.getInstance(); instance.set(Calendar.SECOND,instance.get(Calendar.SECOND)-20); Date time = instance.getTime(); System.out.println("计划执行时间 "+time); Timer timer = new Timer(); timer.scheduleAtFixedRate(myTask,time,2000); } }
当前时间 1576253496008 计划执行时间 Sat Dec 14 00:11:16 CST 2019 MyTask14 begin Sat Dec 14 00:11:36 CST 2019 MyTask14 end Sat Dec 14 00:11:36 CST 2019 MyTask14 begin Sat Dec 14 00:11:36 CST 2019 MyTask14 end Sat Dec 14 00:11:36 CST 2019 MyTask14 begin Sat Dec 14 00:11:36 CST 2019 MyTask14 end Sat Dec 14 00:11:36 CST 2019 MyTask14 begin Sat Dec 14 00:11:36 CST 2019 MyTask14 end Sat Dec 14 00:11:36 CST 2019 MyTask14 begin Sat Dec 14 00:11:36 CST 2019 MyTask14 end Sat Dec 14 00:11:36 CST 2019 MyTask14 begin Sat Dec 14 00:11:36 CST 2019 MyTask14 end Sat Dec 14 00:11:36 CST 2019 MyTask14 begin Sat Dec 14 00:11:36 CST 2019 MyTask14 end Sat Dec 14 00:11:36 CST 2019 MyTask14 begin Sat Dec 14 00:11:36 CST 2019 MyTask14 end Sat Dec 14 00:11:36 CST 2019 MyTask14 begin Sat Dec 14 00:11:36 CST 2019 MyTask14 end Sat Dec 14 00:11:36 CST 2019 MyTask14 begin Sat Dec 14 00:11:36 CST 2019 MyTask14 end Sat Dec 14 00:11:36 CST 2019 MyTask14 begin Sat Dec 14 00:11:36 CST 2019 MyTask14 end Sat Dec 14 00:11:36 CST 2019
任务补充性的进行。
浙公网安备 33010602011771号