在北京这边实习也一个多月了,也接触了不少东西,今天领导开会,说服务器压力太大,客户很不满意,访问速度上要求很苛刻,我们项目里的一些操作,没有必要写成动态的都改写成静态的,每天定时更新一下静态html页面里面的内容(因为客户每天会定时更新一些内容,而且只更新一次)。
听得我好蒙啊,我头一次听说java 的定时操作呢!要命的东西,好坑的啊,晚上抽出了时间,学习了一下java的定时器,也就是一些基本的操作。
java定时器主要用到两个类:Timer(计划任务调度类)和TimerTask(具体任务类)
先介绍TimerTask类吧,这里我们并不是直接去用这个类,这个类是一个抽象类,我们要设置我们自己的计划任务的具体内容,我们可以自定义一个MyTimerTask(名字可以自定义的哈)类,但是必须要继承TimerTask类,这样继承过来之后,就会默认重载一个run方法,而这个方法的正是我们详细的计划任务方法,我们可以直接把我们想要做的操作,写在这个方法里面,这是在最直接的方式了,要是要做的任务很多很多,也可以在写别的方法或者类,我们在这个run方法里面去调用就行。
然后就是Timer类的,呵呵,直接用呗,对于这个类的使用还是参照着下面我给的代码吧!这里我介绍一些这个类的基本信息:
Timer类的构造方法:
好像只有一个,Timer()
//构造方法不必多解释,实例化用途的
常用的方法:
方法摘要 | |
---|---|
|
cancel()
终止此计时器,丢弃所有当前已安排的任务。 |
purge()
从此计时器的任务队列中移除所有已取消的任务。 |
|
schedule(TimerTask task,
安排在指定的时间执行指定的任务。 |
|
schedule(TimerTask task,
安排指定的任务在指定的时间开始进行重复的固定延迟执行。 |
|
schedule(TimerTask task, long delay)
安排在指定延迟后执行指定的任务。 |
|
schedule(TimerTask task, long delay, long period)
安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。 |
|
scheduleAtFixedRate(TimerTask task,
安排指定的任务在指定的时间开始进行重复的固定速率执行。 |
|
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内容了,在看看还有什么需要补充的东西,在补充吧,很晚了!和自己说一声晚安,加油!