定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行。
在Java中,可以通过Timer和TimerTask类来实现定义调度的功能
开发中 Quartz是一个完全由java编写的开源调度框架。
定时器:可以让我们在指定的时间做某件事情,还可以重复的做某件事情。
依赖Timer和TimerTask这两个类:
TimerTask:任务类
Timer:定时类
A、public Timer() 创建一个新计时器。
B、public void schedule(TimerTask task,long delay) 安排在指定延迟后执行指定的任务。
C、public void schedule(TimerTask task,long delay,long period)
安排指定的任务在指定的时间开始进行重复的固定延迟执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。
D、public void schedule(TimerTask task,Date time)
安排在指定的时间执行指定的任务。如果此时间已过去,则安排立即执行该任务。
E、public void cancel() 终止此计时器,丢弃所有当前已安排的任务。
例子1:A+B+E
1 public class TimerDemo1 { 2 public static void main(String[] args) { 3 4 5 //创建定时器对象 6 Timer t = new Timer(); 7 8 // 安排在指定延迟后执行指定的任务。 9 //t.schedule(new MyTask(), 2000); 10 11 //我想要在执行完任务后就停止运行 12 t.schedule(new MyTask(t), 2000); 13 } 14 } 15 //建立所要执行的任务 16 class MyTask extends TimerTask{ 17 //用构造方法初始化定时器对象t 18 private Timer t; 19 public MyTask(){} 20 public MyTask(Timer t){ 21 this.t = t; 22 } 23 @Override 24 public void run() { 25 System.out.println("爆炸"); 26 t.cancel(); 27 } 28 }
例子2:A+C+E
1 /* 2 在指定时间执行一次任务,期后每隔特定时间就执行一次 3 */ 4 public class TimerDemo2 { 5 6 public static void main(String[] args) { 7 // 创建定时器对象 8 Timer t = new Timer(); 9 10 // 在指定时间执行一次任务,期后每隔特定时间就执行一次 11 t.schedule(new MyTask1(), 3000, 2000); 12 13 } 14 } 15 16 // 创建任务 17 class MyTask1 extends TimerTask { 18 @Override 19 public void run() {; 20 System.out.println("爆炸"); 21 22 } 23 }
例子3:指定时间执行任务(指定时间删除目录)
1 /* 2 需求:在指定的时间删除指定目录 demo 3 */ 4 public class TimerTest { 5 6 public static void main(String[] args) throws ParseException { 7 // 创建定时器对象 8 Timer t = new Timer(); 9 // 设定在10:38:40 进行删除 10 String s = "2016-10-12 10:38:40"; 11 // 把字符串s解析为日期 12 SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 13 // String - Date 进行解析 public Date parse(String source); 14 Date d = date.parse(s); 15 16 // 进行定时器任务 17 t.schedule(new Delete(), d); 18 19 } 20 } 21 // 创建任务 22 class Delete extends TimerTask { 23 24 public void run() { 25 // 封装目录 26 File file = new File("demo"); 27 // 删除 28 DeleteFile(file); 29 } 30 31 // 删除目录 32 public void DeleteFile(File file) { 33 // 获取目录中的所有文件或文件夹的名称集合 34 File[] allfile = file.listFiles(); 35 36 // 遍历集合 37 if (allfile != null) {// 目录不为空 38 for (File f : allfile) { 39 if (f.isDirectory()) { 40 // 如果是文件夹,就重新获取名称集合并遍历 41 DeleteFile(f); 42 } else { 43 //如果是文件,就删除。 44 System.out.println(f.getName()+ f.delete()); 45 } 46 } 47 System.out.println(file.getName() + file.delete()); 48 } 49 } 50 }