java定时器
util包中的定时器学习相对比较简单,学习java定时器主要要熟悉两个类,Timer类和TimerTask类。
定时器类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类可以非常容易实现实时调用处理函数。这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需要。
package com.csdn.heima;
import java.io.IOException;
import java.util.Scanner;
import java.util.Timer;
public class TimerTest {
public static void main(String[] args){
Timer timer = new Timer();
timer.schedule(new MyTask(), 1000, 3000);//在1秒后执行此任务,以后每隔1秒执行这个MyTask任务.
while(true){
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
if(str.equals("ok")){
timer.cancel();// 终止此计时器,丢弃所有当前已安排的任务。
}
}
}
static class MyTask extends java.util.TimerTask{
public void run() {
System.out.println("------itcast-----------间隔3秒打印一次~----------csdn-------------");
}
}
}
JAVA WEB定时器,定时器的启动一般随web server的启动而启动,一般有两种方法. 方法一:在web.xml里配置一个Servlet,继承HttpServlet,并设置其随web server的启动而启动。然后在该Servlet的init()方法里启动定时器,在destory()方法里销毁定时器。
方法二:在web.xml里配置一个Listener,继承ServletContextListener,然后在该Listener的初始化方法里启动定时器,在其销毁的方法朝左销毁定时器。
在servlet中启动定时器
一,继承HttpServlet的写法:
1,Servlet
, importjava.io.IOException;
, importjava.util.Timer;
, importjavax.servlet.RequestDispatcher;
, importjavax.servlet.ServletContext;
, importjavax.servlet.ServletException;
, importjavax.servlet.http.HttpServlet;
, importjavax.servlet.http.HttpServletRequest;
, importjavax.servlet.http.HttpServletResponse;
?
,,
,, publicclassConvergeDataServlet extends HttpServlet {
,,
,, private static final long serialVersionUID = 1L;
,,
,, private Timer timer1 = null;
,,
,, private Task task1;
,,
,? /**
,, * Constructor of the object.
,, */
,, public ConvergeDataServlet() {
,, super();
,, }
,,
,, /**
,, * Destruction of the servlet.
,, */
,? public void destroy() {
,, super.destroy();
,, if(timer1!=null){
,, timer1.cancel();
,, }
,, }
,,
,,
,, public void doGet(HttpServletRequest request, HttpServletResponse response)
,, throws ServletException, IOException { ,?
,, }
,,
,,
,, public void doPost(HttpServletRequest request, HttpServletResponse response)
,, throws ServletException, IOException { ,, doGet(request, response); ,, }
,,
,, // init方法启动定时器
,? public void init() throws ServletException { ,,
,, ServletContext context = getServletContext(); ,,
,, // (true为用定时间刷新缓存)
,, String startTask = getInitParameter("startTask"); ,,
,, // 定时刷新时间(分钟)
,, Long delay = Long.parseLong(getInitParameter("delay"));
,,
,? // 启动定时器
,, if(startTask.equals("true")){
,, timer1 = new Timer(true);
,, task1 = new Task(context); ,, timer1.schedule(task1, delay * 60 * 1000, delay * 60 * 1000);
,, }
,, }
,, }
2,任务
,, import java.util.TimerTask;
,,
,? import javax.servlet.ServletContext;
,,
,, public class Task extends TimerTask{
,,
,, private ServletContext context;
,,
,, private static boolean isRunning = true;
,,
,, public Task(ServletContext context){
,, this.context = context;
,? }
,,
,,
,, @Override
,, public void run() {
,, if(isRunning){
,,
,, }
,, }
,,
,? }
3,web.xml中的配置
< servlet >
< servlet-name >taskservlet< / servlet-name >
< servlet-class >com.task< /servlet-class >
< init-param >
< param-name >startTask< /param-name >
< param-value >true< /param-value >
< /init-param >
< init-param >
< param-name >intervalTime< /param-name >
< param-value >1< /param-value >
< /init-param >
< load-on-startup >300< /load-on-startup > < /servlet >
二,继承ServletContextListener
1,定时器
/**
*
*/
package com.annlee.website.util;
import java.util.Timer;
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /**
* @author Administrator 定时器
*/
public class TimerListener implements ServletContextListener {
private Timer timer;
private AnnleeTimerTask task;
public void contextDestroyed(ServletContextEvent arg0) {
timer.cancel();
System.out.println("定时器已销毁");
}
public void contextInitialized(ServletContextEvent event) {
timer = new java.util.Timer(true);
task = new AnnleeTimerTask(event.getServletContext());
System.out.println("定时器已启动");
timer.schedule(task, 0, 60 * 1000);
System.out.println("已经添加任务调度
");
}
}
2,任务
package com.annlee.website.util;
import java.util.Calendar;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import com.annlee.website.model.service.member.UsmAccessDataService;
/**
* 定时器的任务
*/
public class AnnleeTimerTask extends TimerTask { private ServletContext context;
private static boolean isRunning = false;
private static boolean flag = true;
private static final int C_SCHEDULE_HOUR = 0;
private UsmAccessDataService accessDataService;
public AnnleeTimerTask(ServletContext context){
this.context = context;
}
public void run() {
accessDataService = new UsmAccessDataService();
Calendar cal = Calendar.getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY) && flag) {
isRunning = true;
// accessDataService.SendHttpByMonth(0,0, 0);
System.out.println("正在执行任务");
isRunning = false;
flag = false;
context.log("指定任务执行结束");
}
} else {
context.log("上一次任务执行还未结束");
}
if(C_SCHEDULE_HOUR != cal.get(Calendar.HOUR_OF_DAY)){
flag = true;
}
}
}
3,web.xml中的配置
com.annlee.website.util.TimerListener
======================================================================
=23:59:59 1 其实我想实现的就是在每天这个时间调用次方法就结束每天如此希望高手
指点
我来帮他解答
2011-8-19 16:58
满意回答
import java.util.GregorianCalendar; import java.util.Timer;
import java.util.TimerTask;
/**
*
* @author Administrator
*/
public class TimerDemo {
public static void main(String[] args) {
/** */ 对象句柄
final TimerDemo td = new TimerDemo();
// Java 的计时器,可以规定从某一个时刻起,以后每对少时间循环执行一次
new Timer().schedule(new TimerTask() {
@Override
public void run() {
td.print();
}
}, new GregorianCalendar(2011, 8, 19, 23, 59, 59).getTime(),
24 * 60 * 60 * 1000);
}
/**
* 要调用的函数
*/
private void print() {
System.out.println("Test");
}
}
===============================================================================下面是我写的程序,就是用2个定时器中断T0和T1每隔一秒钟1S钟让数码管
的数字减1,同时流水灯流一下。 我虽然写出来了,但是搞不明白,这两个中断同时是1S
钟产生的,不是中断有优先级的吗,怎么这个程序的数码管和流水灯都是1S钟换一个值
呢, 我的想法是T0的优先级高于T1的,当道了1S的时候,T0首先流水灯流一下,但是
流过之后,就不是1S了,T1中断应该就没了吧,数码管也就不减1了。 搞不明白啊
#include
#include unsigned long int o; unsigned int
s,d; unsigned char code duan[]={0xC0 ,0xF9 ,0xA4 ,0xB0 ,0x99 ,0x92 ,0x82 ,0xF8, 0x80 ,0x90}; //数码管显示显示0-9的值表 void init () //一些变量和中断T0T1的初始化
{ s=0;d=0; P1=0xfe; //P1口是LED流水灯口,让他只亮一个灯,等下T0中断有程
序可以让他循环亮 o=20000000; //P0口是数码管的段选,o的值是数码管显示的值
TMOD=0x11; //以下都是定时器T0T1的初始化 TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=(65535-50000)/256; TL1=(65535-50000)%256; EA=1; ET0=1; ET1=1; TR0=1; TR1=1; } void delay(unsigned int j)//延时
程序,数码管扫描时延时的,我试了不用这个延时数码管也可以正常显示 { int m;
for(m=0;m
TimeServlet
com.mytimer.TimeServlet
11
TimeServlet
/servlet/TimeServlet
(2)实现定时servlet:
package com.mytimer;
import java.io.IOException;
import java.util.Timer;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
public class TimeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public TimeServlet()
{
super();
}
public void init() throws ServletException
{
Timer timer = new Timer();
timer.schedule(new MyTask(), 120000, 60000);// 在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.
// // 这个是用来停止此任务的,否则就一直循环执行此任务了
// while (true)
// {
// try
// {
// int ch = System.in.read(); //输入字符“c”,回车即停止执行 // if (ch - 'c' == 0) // {
// timer.cancel();// 使用这个方法退出任务
// }
//
// } catch (IOException e) // {
// e.printStackTrace(); // }
// }
}
//具体执行的任务
class MyTask extends java.util.TimerTask
{
public void run()
{
System.out.println("____ok____");
}
}
public void destroy()
{
super.destroy();
}
}