java定时器在web中的应用还是颇为广泛的,比如我们玩的qq农场等等典型的例子,下面就是一个后台应用程序和web后台程序的两个例子
(1) 后台程序
package com.test; import java.io.IOException; import java.util.Timer; /** * 定时器类Timer在java.util包中。使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法, * 设定指定的任务task在指定的延迟delay后执行。定时器任务类TimerTask是抽象类,继承并重写其run()方法,可实现具体任务。 * schedule(TimerTask task, Date time)设定指定任务task在指定时间time执行。 cancel()方法结束这个定时器。 * schedule(TimerTask task, long delay, long * period)方法设定指定任务task在指定延迟delay后进行固定延迟peroid的执行。 scheduleAtFixedRate(TimerTask * task, long delay, long period)方法设定指定任务task在指定延迟delay后进行固定频率peroid的执行。 * 要实现一个定时任务 * ,运用java中的Timer和TimerTask类可以非常容易实现实时调用处理函数。这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需要。 */ public class TimerTest { public static void main(String[] args) { // 定义一个定时器 Timer timer = new Timer(); // 在1秒后执行任务,每次间隔2秒,如果传递一个Date的参数,就可以在某个固定的时间执行这个任务 timer.schedule(new MyTask(), 1000, 2000); System.out.println("___进入 while ___"); while (true) { try { System.out.println("c" + 'c'); int ch = System.in.read(); System.out.println("ch: " + ch); if (ch - 'c' == 0) { timer.cancel(); // 退出任务 } } catch (IOException e) { e.printStackTrace(); } } } /** * TimerTask必须继承run()方法 */ static class MyTask extends java.util.TimerTask { @Override public void run() { System.out.println("********** 进入run()方法 ***********"); } } }
执行效果:
___进入 while ___
cc
********** 进入run()方法 ***********
********** 进入run()方法 ***********
********** 进入run()方法 ***********
********** 进入run()方法 ***********
cc
********** 进入run()方法 ***********
********** 进入run()方法 ***********
********** 进入run()方法 ***********
********** 进入run()方法 ***********
..........
(2)Web程序调用,每次到12点时候就记录到一个文本信息中
定义类:SetTimerExecute
package com.test; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * web定时器 * 继承TimerTask抽象类,必须重写contextDestroyed(销毁),contextInitialized(初始化),run(执行)方法 * 实现ServletContextListener接口 */ public class SetTimerExecute extends TimerTask implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("******** 服务器停止 ******"); } @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("******** 服务器启动 ******"); // 新建一个时间控件 Timer timer = new Timer(); timer.schedule(new SetTimerExecute(), 1000, 1000); } @Override public void run() { FileWriter fw = null; // 创建文件流 BufferedWriter buf = null; try { File file = new File("/test.txt"); if (!file.exists()) file.createNewFile(); // 创建文件 fw = new FileWriter(file, true); // 是否在后面进行追加内容,如果为true的话进行追加内容 buf = new BufferedWriter(fw); Date day = new Date(); System.out.println("现在时刻:" + day.getHours()); // 每天上午10点写入到文件 if (day.getHours() == 12) { System.out.println("等于12点"); fw.write("现在时刻,北京时间:" + day.getHours() + "点 " + day.getMinutes() + "分 " + day.getSeconds() + " 秒"); buf.newLine(); // 追加一行 } } catch (Exception e) { e.printStackTrace(); } finally { try { if (buf != null) { buf.flush(); // 把缓冲区的数据强行输出 } if (fw != null) { fw.close(); // 关闭流 } } catch (Exception e2) { e2.printStackTrace(); } } } }
配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <listener> <listener-class>com.test.SetTimerExecute</listener-class> </listener> </web-app>
运行时会在你运行环境的根目录下创建一个text的文本文件,没到12点就往这个文件中添加时间