前言:
定时器、计划功能在移动开发领域使用比较多,比如Android 技术
定时任务功能在java中主要使用的就是Timer对象,他在内部还是使用多线程
的方式进行处理,所以它和线程技术还是有非常大的关联。本章重点几下
1.如何实现指定时间执行任务
2.如何实现按指定周期执行任务。
一、定时器Timer的使用
jdk中,Timer类主要负责任务的功能,也就是在指定的时间开始执行某一任务
Timer类的主要作用就是设置计划,但封装任务类确实TimerTask类。
执行计划任务的代码要放在TimerTask类中,因为它是一个抽象类。
方法xchedule( TimerTask task,Date time)
作用是在指定的日期执行某一次任务
(一)执行任务的时间晚于当前时间,在未来执行的效果
package com.it.po.thread12; import java.util.Date; import java.util.TimerTask; public class MyTask1 extends TimerTask{ @Override public void run() { System.out.println("执行任务时间 "+new Date()); } }
package com.it.po.thread12; import com.it.po.thread05.Task1; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run1 { public static void main(String[] args) { System.out.println("当前时间 "+new Date()); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.SECOND,8); Date time = calendar.getTime(); MyTask1 myTask1 = new MyTask1(); Timer timer = new Timer(); timer.schedule(myTask1,time); } }
当前时间 Tue Dec 10 22:03:44 CST 2019
执行任务时间 Tue Dec 10 22:03:52 CST 2019
注意:程序运行时,一直红色,因为new Timer() 一次创建一个线程。
源码如下
public Timer() { this("Timer-" + serialNumber()); }
public Timer(String name) { thread.setName(name); thread.start(); }
修改如下
package com.it.po.thread12; import com.it.po.thread05.Task1; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run1 { public static void main(String[] args) { System.out.println("当前时间 "+new Date()); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.SECOND,8); Date time = calendar.getTime(); MyTask1 myTask1 = new MyTask1(); Timer timer = new Timer(true); timer.schedule(myTask1,time); } }
’让其变成了守护线程
public Timer(boolean isDaemon) { this("Timer-" + serialNumber(), isDaemon); }
当前时间 Tue Dec 10 22:08:48 CST 2019
Process finished with exit code 0
结果只是执行main方法里面的代码,TimerTask代码不被执行。
(二)计划时间早于当前时间,提前运行的效果。
package com.it.po.thread12; import java.util.Date; import java.util.TimerTask; public class MyTask2 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 Run2 { public static void main(String[] args) { System.out.println("当前时间 "+new Date()); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.SECOND,calendar.get(Calendar.SECOND)-5); Date time= calendar.getTime(); System.out.println("计划执行时间 "+time); MyTask2 myTask2 = new MyTask2(); Timer timer = new Timer(); timer.schedule(myTask2,time); } }

当前时间 Tue Dec 10 22:14:42 CST 2019 计划执行时间 Tue Dec 10 22:14:37 CST 2019 执行任务时间 Tue Dec 10 22:14:42 CST 2019
(三)、Timer中允许有多个TimerTask 任务以及延时的测试。
package com.it.po.thread12; import java.util.Date; import java.util.TimerTask; public class MyTask3 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 Run3 { public static void main(String[] args) { System.out.println("当前时间 "+new Date()); Calendar calendar1 = Calendar.getInstance(); calendar1.add(Calendar.SECOND,3); Date time1= calendar1.getTime(); System.out.println("计划执行时间time1 "+time1); Calendar calendar2 = Calendar.getInstance(); calendar2.add(Calendar.SECOND,6); Date time2= calendar2.getTime(); System.out.println("计划执行时间time2 "+time2); MyTask3 myTask1 = new MyTask3(); MyTask3 myTask2 = new MyTask3(); Timer timer = new Timer(); timer.schedule(myTask1,time1); timer.schedule(myTask2,time2); } }
当前时间 Tue Dec 10 22:43:10 CST 2019 计划执行时间time1 Tue Dec 10 22:43:13 CST 2019 计划执行时间time2 Tue Dec 10 22:43:16 CST 2019 执行任务时间 Tue Dec 10 22:43:13 CST 2019 执行任务时间 Tue Dec 10 22:43:16 CST 2019

TimerTask是以队列的方式一个一个被顺序性执行,所以执行的时间有可能
和预期时间不一致,因为前面的任务可能消耗的时间较长,
后面运行的时间也被拖延。

package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run4 { public static void main(String[] args) { System.out.println("当前时间 "+new Date()); Calendar calendar1 = Calendar.getInstance(); calendar1.add(Calendar.SECOND,1); Date time1= calendar1.getTime(); System.out.println("A 计划执行时间time1 "+time1); Calendar calendar2 = Calendar.getInstance(); calendar2.add(Calendar.SECOND,5); Date time2= calendar2.getTime(); System.out.println("B 计划执行时间time2 "+time2); MyTask4A myTask1 = new MyTask4A(); MyTask4B myTask2 = new MyTask4B(); Timer timer = new Timer(); timer.schedule(myTask1,time1); timer.schedule(myTask2,time2); } }
当前时间 Tue Dec 10 22:50:41 CST 2019 A 计划执行时间time1 Tue Dec 10 22:50:42 CST 2019 B 计划执行时间time2 Tue Dec 10 22:50:46 CST 2019 MyTask4A begin Tue Dec 10 22:50:42 CST 2019 MyTask4A end Tue Dec 10 22:50:52 CST 2019 MyTask4B begin Tue Dec 10 22:50:52 CST 2019 MyTask4B end Tue Dec 10 22:50:53 CST 2019
二、方法schedule(TimerTask task ,Date firstTime ,long period )
package com.it.po.thread12; import java.util.Date; import java.util.TimerTask; public class MyTask5 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 Run5 { public static void main(String[] args) { System.out.println("当前时间 "+new Date()); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.SECOND,2); Date time = calendar.getTime(); MyTask1 myTask1 = new MyTask1(); Timer timer = new Timer(); timer.schedule(myTask1,time,3000); } }
没3s执行一次
当前时间 Tue Dec 10 22:57:21 CST 2019 执行任务时间 Tue Dec 10 22:57:23 CST 2019 执行任务时间 Tue Dec 10 22:57:26 CST 2019 执行任务时间 Tue Dec 10 22:57:29 CST 2019 执行任务时间 Tue Dec 10 22:57:32 CST 2019 执行任务时间 Tue Dec 10 22:57:35 CST 2019 执行任务时间 Tue Dec 10 22:57:38 CST 2019 执行任务时间 Tue Dec 10 22:57:41 CST 2019 执行任务时间 Tue Dec 10 22:57:44 CST 2019 执行任务时间 Tue Dec 10 22:57:47 CST 2019 。。。。

无限重复执行
(一)、计划时间早于当前时间--提前运行效果
package com.it.po.thread12; import java.util.Date; import java.util.TimerTask; public class MyTask6 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 Run6 { public static void main(String[] args) { System.out.println("当前时间 "+new Date()); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.SECOND,calendar.get(Calendar.SECOND)-10); Date time = calendar.getTime(); System.out.println("计划执行时间 "+time); MyTask6 myTask6 = new MyTask6(); Timer timer = new Timer(); timer.schedule(myTask6,time,4000); } }
当前时间 Tue Dec 10 23:04:06 CST 2019 计划执行时间 Tue Dec 10 23:03:56 CST 2019 执行任务时间 Tue Dec 10 23:04:06 CST 2019 执行任务时间 Tue Dec 10 23:04:10 CST 2019 执行任务时间 Tue Dec 10 23:04:14 CST 2019 执行任务时间 Tue Dec 10 23:04:18 CST 2019 执行任务时间 Tue Dec 10 23:04:22 CST 2019 执行任务时间 Tue Dec 10 23:04:26 CST 2019 执行任务时间 Tue Dec 10 23:04:30 CST 2019 。。。
程序运行后立即执行任务
(二)、任务执行时间被延时
package com.it.po.thread12; import java.util.Date; import java.util.TimerTask; public class MyTask7 extends TimerTask{ @Override public void run() { try { System.out.println("MyTask7 begin "+new Date()); Thread.sleep(5000); System.out.println("MyTask7 end "+new Date()); } catch (InterruptedException e) { e.printStackTrace(); } } }
package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run7 { public static void main(String[] args) { System.out.println("当前时间 "+new Date()); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.SECOND,10); Date time= calendar.getTime(); System.out.println("计划执行时间 "+time); MyTask7 myTask7 = new MyTask7(); Timer timer = new Timer(); timer.schedule(myTask7,time,3000); } }
当前时间 Tue Dec 10 23:09:18 CST 2019 计划执行时间 Tue Dec 10 23:09:28 CST 2019 MyTask7 begin Tue Dec 10 23:09:28 CST 2019 MyTask7 end Tue Dec 10 23:09:33 CST 2019 MyTask7 begin Tue Dec 10 23:09:33 CST 2019 MyTask7 end Tue Dec 10 23:09:38 CST 2019 MyTask7 begin Tue Dec 10 23:09:38 CST 2019 MyTask7 end Tue Dec 10 23:09:43 CST 2019 MyTask7 begin Tue Dec 10 23:09:43 CST 2019 MyTask7 end Tue Dec 10 23:09:48 CST 2019 。。。
先延时10s执行,虽然设置了3s重复执行,但是执行一次任务需要5s
所以任务执行完又立即执行。
修改如下
package com.it.po.thread12; import java.util.Calendar; import java.util.Date; import java.util.Timer; public class Run7 { public static void main(String[] args) { System.out.println("当前时间 "+new Date()); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.SECOND,10); Date time= calendar.getTime(); System.out.println("计划执行时间 "+time); MyTask7 myTask7 = new MyTask7(); Timer timer = new Timer(); timer.schedule(myTask7,time,7000); } }
当前时间 Tue Dec 10 23:12:04 CST 2019 计划执行时间 Tue Dec 10 23:12:14 CST 2019 MyTask7 begin Tue Dec 10 23:12:14 CST 2019 MyTask7 end Tue Dec 10 23:12:19 CST 2019 MyTask7 begin Tue Dec 10 23:12:21 CST 2019 MyTask7 end Tue Dec 10 23:12:26 CST 2019 MyTask7 begin Tue Dec 10 23:12:28 CST 2019 MyTask7 end Tue Dec 10 23:12:33 CST 2019 MyTask7 begin Tue Dec 10 23:12:35 CST 2019 MyTask7 end Tue Dec 10 23:12:40 CST 2019 MyTask7 begin Tue Dec 10 23:12:42 CST 2019 MyTask7 end Tue Dec 10 23:12:47 CST 2019 MyTask7 begin Tue Dec 10 23:12:49 CST 2019 MyTask7 end Tue Dec 10 23:12:54 CST 2019 MyTask7 begin Tue Dec 10 23:12:56 CST 2019 MyTask7 end Tue Dec 10 23:13:01 CST 2019
浙公网安备 33010602011771号