天天看点

java 定时器的使用

        在北京这边实习也一个多月了,也接触了不少东西,今天领导开会,说服务器压力太大,客户很不满意,访问速度上要求很苛刻,我们项目里的一些操作,没有必要写成动态的都改写成静态的,每天定时更新一下静态html页面里面的内容(因为客户每天会定时更新一些内容,而且只更新一次)。

听得我好蒙啊,我头一次听说java 的定时操作呢!要命的东西,好坑的啊,晚上抽出了时间,学习了一下java的定时器,也就是一些基本的操作。

java定时器主要用到两个类:Timer(计划任务调度类)和TimerTask(具体任务类)

先介绍TimerTask类吧,这里我们并不是直接去用这个类,这个类是一个抽象类,我们要设置我们自己的计划任务的具体内容,我们可以自定义一个MyTimerTask(名字可以自定义的哈)类,但是必须要继承TimerTask类,这样继承过来之后,就会默认重载一个run方法,而这个方法的正是我们详细的计划任务方法,我们可以直接把我们想要做的操作,写在这个方法里面,这是在最直接的方式了,要是要做的任务很多很多,也可以在写别的方法或者类,我们在这个run方法里面去调用就行。

然后就是Timer类的,呵呵,直接用呗,对于这个类的使用还是参照着下面我给的代码吧!这里我介绍一些这个类的基本信息:

Timer类的构造方法:

好像只有一个,Timer() //构造方法不必多解释,实例化用途的

常用的方法:

方法摘要

cancel()

          终止此计时器,丢弃所有当前已安排的任务。

purge()

          从此计时器的任务队列中移除所有已取消的任务。

schedule(TimerTask task, Date time)

          安排在指定的时间执行指定的任务。

schedule(TimerTask task, Date firstTime, long period)

          安排指定的任务在指定的时间开始进行重复的固定延迟执行。

schedule(TimerTask task, long delay)

          安排在指定延迟后执行指定的任务。

schedule(TimerTask task, long delay, long period)

          安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。

scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

          安排指定的任务在指定的时间开始进行重复的固定速率执行。

scheduleAtFixedRate(TimerTask task, long delay, long period)

          安排指定的任务在指定的延迟后开始进行重复的固定速率执行。

这里的话,我简单介绍定时器的触发以及使用:

使用,看看下面的代码,结合上述所属,应该很明确了!小弟不才,如发现错误希望纠正哈!

public class MyTimerTask extends TimerTask {
	private static int i = 0;

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("--------------" + (i++) + "---------------");
	}
}
           
public class Mytimer {
	public static void main(String args[]) throws ParseException {
		Timer time = new Timer();
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = format.parse("2014-08-19 21:56:03");
		time.scheduleAtFixedRate(new MyTimerTask(), date, 1000);
	}
}
           

有一定java基础的肯定能看出来,我就是在一个简单的java类里面就触发了这个计划任务!

那么我们怎么让我们的java web项目已启动的时候就去触发这个机会任务,服务器只要开启了,计划任务就存在,怎么去做呢,这里我介绍使用servlet来触发:

首先我们要做的就是把上面的Mytimer类改写成一个正规的servlet类,如下:

public class Mytimer extends HttpServlet {
	public void init() {
		Timer time = new Timer();
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date;
		try {
			date = format.parse("2014-08-19 23:00:03");
			time.scheduleAtFixedRate(new MyTimerTask(), 0, 1000);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
           

然后就需要配置我们项目的配置文件WEB.XML文件了,我们在这里面,让定时器在服务器开启了的时候就加载进来,详细的配置如下:

<servlet>
     	<servlet-name>Timer</servlet-name>
     	<servlet-class>action.TimerUtils.Mytimer</servlet-class>
     	<load-on-startup>0</load-on-startup>
     </servlet>
           

简单介绍一下这里面的load-on-startup的作用吧!也是我看到的网友总结的这个,我之前也不知道呢!

load-on-startup的取值一般都是正数或者0,我们通常取0,1,2,3,4,5,值越小越优先加载

好了,等这几天在项目里面具体实现定时更新静态html内容了,在看看还有什么需要补充的东西,在补充吧,很晚了!和自己说一声晚安,加油!