Java定时器的连两个小示例

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()方法 ***********
..........
(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点就往这个文件中添加时间


赞(52) 打赏
未经允许不得转载:优客志 » JAVA开发
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏