当前位置:文档之家› java定时器

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-------------");}}}JA V A WEB定时器,定时器的启动一般随web server的启动而启动,一般有两种方法.方法一:在web.xml里配置一个Servlet,继承HttpServlet,并设置其随web server的启动而启动。

然后在该Servlet的init()方法里启动定时器,在destory()方法里销毁定时器。

方法二:在web.xml里配置一个Listener,继承ServletContextListener,然后在该Listener的初始化方法里启动定时器,在其销毁的方法朝左销毁定时器。

在servlet中启动定时器一,继承HttpServlet的写法:1,Servlet1importjava.io.IOException;2importjava.util.Timer;3importjavax.servlet.RequestDispatcher;4importjavax.servlet.ServletContext;5importjavax.servlet.ServletException;6importjavax.servlet.http.HttpServlet;7importjavax.servlet.http.HttpServletRequest;8importjavax.servlet.http.HttpServletResponse;91011publicclassConvergeDataServlet extends HttpServlet {1213private static final long serialVersionUID = 1L;1415private Timer timer1 = null;1617private Task task1;1819/**20* Constructor of the object.21*/22public ConvergeDataServlet() {23super();24}2526/**27* Destruction of the servlet.28*/29public void destroy() {30super.destroy();31if(timer1!=null){32timer1.cancel();33}34}353637public void doGet(HttpServletRequest request, HttpServletResponse response) 38throws ServletException, IOException {3940}414243public void doPost(HttpServletRequest request, HttpServletResponse response) 44throws ServletException, IOException {45doGet(request, response);46}4748// init方法启动定时器49public void init() throws ServletException {5051ServletContext context = getServletContext();5253// (true为用定时间刷新缓存)54String startTask = getInitParameter("startTask");5556// 定时刷新时间(分钟)57Long delay = Long.parseLong(getInitParameter("delay"));5859// 启动定时器60if(startTask.equals("true")){61timer1 = new Timer(true);62task1 = new Task(context);63timer1.schedule(task1, delay * 60 * 1000, delay * 60 * 1000);64}65}66}2,任务67import java.util.TimerTask;6869import javax.servlet.ServletContext;7071public class Task extends TimerTask{7273private ServletContext context;7475private static boolean isRunning = true;7677public Task(ServletContext context){78this.context = context;79}808182@Override83public void run() {84if(isRunning){8586}87}8889}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 >二,继承ServletContextListener1,定时器/****/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 mAccessDataService;/*** 定时器的任务*/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中的配置<listener><listener-class>com.annlee.website.util.TimerListener</listener-class></listener>====================================================================== =其实我想实现的就是在每天23:59:59 这个时间调用1次方法就结束每天如此希望高手指点我来帮他解答2011-8-19 16:58满意回答import java.util.GregorianCalendar;import java.util.Timer;import java.util.TimerT ask;/**** @author Administrator*/public class TimerDemo {public static void main(String[] args) {/** 对象句柄*/final TimerDemo td = new TimerDemo();// Java的计时器,可以规定从某一个时刻起,以后每对少时间循环执行一次new Timer().schedule(new TimerTask() {@Overridepublic 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,同时流水灯流一下。

相关主题