java定时器的具体使用和web使用

 公司部分项目提出将某些项目进行静态化...所以在测试页面命中率和数据库访问量之后针对某些写的频率比较低和访问比较大页面进行静态化。当然也不是进行实时的静态化.这里需要使用定时器来进行静态化的控制.下面了解一下定时器的应用!
1.具体方法的了解

 

(1)Timer.schedule(TimerTask task,Date time)//安排在制定的时间执行指定的任务。  

  1. (2)Timer.schedule(TimerTask task,Date firstTime ,long period)//安排指定的任务在指定的时间开始进行重复的固定延迟执行.  
  2. (3)Timer.schedule(TimerTask task,long delay)//安排在指定延迟后执行指定的任务.  
  3. (4)Timer.schedule(TimerTask task,long delay,long period)//安排指定的任务从指定的延迟后开始进行重复的固定延迟执行.  
  4. (5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)//安排指定的任务在指定的时间开始进行重复的固定速率执行.  
  5. (6)Timer.scheduleAtFixedRate(TimerTask task,long delay,long period)//安排指定的任务在指定的延迟后开始进行重复的固定速率执行.  
(1)Timer.schedule(TimerTask task,Date time)//安排在制定的时间执行指定的任务。
(2)Timer.schedule(TimerTask task,Date firstTime ,long period)//安排指定的任务在指定的时间开始进行重复的固定延迟执行.
(3)Timer.schedule(TimerTask task,long delay)//安排在指定延迟后执行指定的任务.
(4)Timer.schedule(TimerTask task,long delay,long period)//安排指定的任务从指定的延迟后开始进行重复的固定延迟执行.
(5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)//安排指定的任务在指定的时间开始进行重复的固定速率执行.
(6)Timer.scheduleAtFixedRate(TimerTask task,long delay,long period)//安排指定的任务在指定的延迟后开始进行重复的固定速率执行.

2.简单的测试方法

Java代码  

  1. import java.io.IOException;   
  2. import java.util.Timer;   
  3.   
  4. public class TimerTest {   
  5.   
  6. public static void main(String[] args){   
  7. Timer timer = new Timer();   
  8. timer.schedule(new MyTask(), 1000, 2000);//在1秒后执行此任务,每次间隔2秒  
  9.   
  10.    while(true){//这个是用来停止此任务的,否则就一直循环执行此任务了  
  11.    try {   
  12.     int ch = System.in.read();   
  13.     if(ch-'c'==0){   
  14.      timer.cancel();//使用这个方法退出任务   
  15.     }   
  16.    } catch (IOException e) {   
  17.     // TODO Auto-generated catch block
      
  18.     e.printStackTrace();   
  19.    }   
  20. }   
  21. }   
  22.   
  23. static class MyTask extends java.util.TimerTask{   
  24.    @Override  
  25.    public void run() {   
  26.     // TODO Auto-generated method stub
      
  27.     System.out.println("我是来测试的。。我两秒出来一次");   
  28.    }   
  29. }   
  30. }  
import java.io.IOException;
import java.util.Timer;

public class TimerTest {

public static void main(String[] args){
Timer timer = new Timer();
timer.schedule(new MyTask(), 1000, 2000);//在1秒后执行此任务,每次间隔2秒

   while(true){//这个是用来停止此任务的,否则就一直循环执行此任务了
   try {
    int ch = System.in.read();
    if(ch-'c'==0){
     timer.cancel();//使用这个方法退出任务
    }
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
}
}

static class MyTask extends java.util.TimerTask{
   @Override
   public void run() {
    // TODO Auto-generated method stub
    System.out.println("我是来测试的。。我两秒出来一次");
   }
}
}

这样,每隔两秒钟就会在控制台输出语句。

3.根据实际需要进行例子测试
由于我们刷新一些页面或者数据的时候.都会选择在一天的某个时候或者几天!这里就需要针对某个固定时间来制作这个定时器

Java代码  

  1. public class TimerTest {   
  2.     /**  
  3.      * 每天固定时间更新  
  4.      * 每天9点14分  
  5.      */  
  6.     @Test  
  7.     public void testRegular() {   
  8.         new Date();   
  9.         Timer timer = new Timer();   
  10.         timer.schedule(new MyTask(getRegularDate("HH:mm", "11:21")),getRegularDate("HH:mm", "11:21"));//每天固定时间更新,每天11点21分  
  11.     }   
  12.     /**  
  13.      *   
  14.      * @author chenjinjie  
  15.      *  
  16.      */  
  17.     static class MyTask extends java.util.TimerTask{   
  18.         private Date time;   
  19.         public MyTask() {   
  20.         }   
  21.         public MyTask(Date time) {   
  22.             this.time = time;   
  23.         }   
  24.        @Override  
  25.        public void run() {   
  26.         if(new Date().after(time))//这里主要是防止服务器重启之后发觉时间旧了会自动刷新一次  
  27.         System.out.println("我是来测试的。。固定时间"+time);   
  28.        }   
  29.     }   
  30.      /**  
  31.      * 根据日期字符串获取日期对象,精确到当天凌晨零点零分,字符串格式:"YYYY-MM-DD" 
  32.      * @param fomatStr 如(yyyy年MM月dd日 HH:mm)
     
  33.      * @param dateSource 源日期(String)  
  34.      * @return  
  35.      */  
  36.     public static Date getRegularDate(String formatData,String dateString){   
  37.         SimpleDateFormat   formatter   =   new   SimpleDateFormat   (formatData);      
  38.         Date d = null;   
  39.         try {   
  40.             d = formatter.parse(dateString);   
  41.         } catch (ParseException e) {   
  42.             e.printStackTrace();   
  43.         }   
  44.         Calendar calendar = Calendar.getInstance();   
  45.         calendar.set(Calendar.HOUR_OF_DAY, d.getHours());   
  46.         calendar.set(Calendar.MINUTE, d.getMinutes());   
  47.         calendar.set(Calendar.SECOND, d.getSeconds());   
  48.         Date time = calendar.getTime();   
  49.         return time;   
  50.     }   
  51. }  
public class TimerTest {
	/**
	 * 每天固定时间更新
	 * 每天9点14分
	 */
	@Test
	public void testRegular() {
		new Date();
		Timer timer = new Timer();
		timer.schedule(new MyTask(getRegularDate("HH:mm", "11:21")),getRegularDate("HH:mm", "11:21"));//每天固定时间更新,每天11点21分
	}
	/**
	 *
	 * @author chenjinjie
	 *
	 */
	static class MyTask extends java.util.TimerTask{
		private Date time;
		public MyTask() {
		}
		public MyTask(Date time) {
			this.time = time;
		}
	   @Override
	   public void run() {
		if(new Date().after(time))//这里主要是防止服务器重启之后发觉时间旧了会自动刷新一次
	    System.out.println("我是来测试的。。固定时间"+time);
	   }
	}
	 /**
     * 根据日期字符串获取日期对象,精确到当天凌晨零点零分,字符串格式:"YYYY-MM-DD"
     * @param fomatStr 如(yyyy年MM月dd日 HH:mm)
	 * @param dateSource 源日期(String)
     * @return
     */
    public static Date getRegularDate(String formatData,String dateString){
    	SimpleDateFormat   formatter   =   new   SimpleDateFormat   (formatData);
    	Date d = null;
		try {
			d = formatter.parse(dateString);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, d.getHours());
		calendar.set(Calendar.MINUTE, d.getMinutes());
		calendar.set(Calendar.SECOND, d.getSeconds());
		Date time = calendar.getTime();
    	return time;
    }
}

以上只是初步简单的使用..

4.定时器在JSP中的应用。在JSP中可以靠监听器和定时器的结合来解决某些问题

4.1 先来一个定时器的任务:

Java代码  

  1. public class Task extends TimerTask {    
  2.       private static final int C_SCHEDULE_HOUR = 0; 
      
  3.       private static boolean isRunning = false;    
  4.       private ServletContext context = null;    
  5.   
  6.       public Task() {    
  7.       }    
  8.       public Task(ServletContext context) {    
  9.         this.context = context;    
  10.       }    
  11.   
  12.       public void run() {    
  13.         Calendar cal = Calendar.getInstance();    
  14.         if (!isRunning) {    
  15.             context.log("开始执行指定任务");    
  16.             System.out.println("执行定时任务");   
  17.             context.log("指定任务执行结束");    
  18.         }    
  19.         else {    
  20.           context.log("上一次任务执行还未结束");    
  21.         }    
  22.       }  
public class Task extends TimerTask {
	  private static final int C_SCHEDULE_HOUR = 0;
	  private static boolean isRunning = false;
	  private ServletContext context = null; 

	  public Task() {
	  }
	  public Task(ServletContext context) {
	    this.context = context;
	  } 

	  public void run() {
	    Calendar cal = Calendar.getInstance();
	    if (!isRunning) {
	    	context.log("开始执行指定任务");
	    	System.out.println("执行定时任务");
	    	context.log("指定任务执行结束");
	    }
	    else {
	      context.log("上一次任务执行还未结束");
	    }
	  }

4.2然后监听器(注意实现的接口):

Java代码  

  1. public class ContextListener    
  2. extends HttpServlet    
  3. implements ServletContextListener {    
  4. public ContextListener() {    
  5. }    
  6.   
  7. private java.util.Timer timer = null;    
  8. public void contextInitialized(ServletContextEvent event) {    
  9. timer = new java.util.Timer(true);    
  10. event.getServletContext().log("定时器已启动");    
  11. timer.schedule(new Task(event.getServletContext()), 0, 10*60*1000); //开启后.每10分钟刷新一次  
  12. event.getServletContext().log("已经添加任务调度表");    
  13. }    
  14.   
  15. public void contextDestroyed(ServletContextEvent event) {    
  16. timer.cancel();    
  17. event.getServletContext().log("定时器销毁");    
  18. }    
  19. }   
public class ContextListener
extends HttpServlet
implements ServletContextListener {
public ContextListener() {
} 

private java.util.Timer timer = null;
public void contextInitialized(ServletContextEvent event) {
timer = new java.util.Timer(true);
event.getServletContext().log("定时器已启动");
timer.schedule(new Task(event.getServletContext()), 0, 10*60*1000); //开启后.每10分钟刷新一次
event.getServletContext().log("已经添加任务调度表");
} 

public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
event.getServletContext().log("定时器销毁");
}
}

4.3最后配置XML文件。

web-app 标签内添加

<listener>
    <listener-class>cn.read.web.listener.ContextListener </listener-class>
</listener>

这样启动Tomcat后就会在控制台输出当前日期。。

5.项目的具体使用和感想
这只是在项目的初步规划.可能实行过程中还会出现很多问题.比如网络和服务器重启等...不过会在后面开发中继续努力改进.使其功能更加完善.

时间: 2024-11-01 12:29:50

java定时器的具体使用和web使用的相关文章

java定时器问题 ,实现每天指定时间执行任务

问题描述 java定时器问题 ,实现每天指定时间执行任务 我想让tomcat启动的时候执行一次,然后每天的凌晨1点执行一次 ,可是tomcat启动的时间不固定 ,不一定是1点,,,,,,,,,怎么实现呢? 解决方案 tomcat启动时最简单的就是web.xml配置一个servlet,启动时执行代码就行了. 1点钟的定时该怎么配就怎么配 解决方案二: 在tomcat启动你的servlet时,第一次启动你的定时器,并且这个时候,你的代码要捕捉当前的时间,然后利用当前的时间来计算凌晨1点的时间,然后设

java定时器使用

定时器类Timer在java.util包中.使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定指定的任务task在指定的延迟delay后执行.定时器任务类TimerTask是抽象类,继承并重写其run()方法,可实现具体任务. schedule(TimerTask task, Date time)设定指定任务task在指定时间time执行. cancel()方法结束这个定时器. schedule(TimerTask task, lo

java开发 后台报org.springframework.web.servlet.DispatcherServlet

问题描述 java开发 后台报org.springframework.web.servlet.DispatcherServlet 2014-6-4 17:22:07 org.apache.catalina.core.AprLifecycleListener init 信息: Loaded APR based Apache Tomcat Native library 1.1.29 using APR version 1.4.8. 2014-6-4 17:22:07 org.apache.catal

java定时器 run方法怎么返回值 我要返回result 代码里一直报错 晚生跪求解决

问题描述 java定时器 run方法怎么返回值 我要返回result 代码里一直报错 晚生跪求解决 public VirementResultInfo queryTransaction( final String bank, final TransactionInfo transactionInfo) { // final VirementResultInfo result = null; TimerTask task = new TimerTask() { @Override public v

java定时器和多线程实践记录

这几天因为需要测试mongodb读写分离的问题,因此写了个定时查询程序,并且用到了多线程,以达到定时启动多个线程查询数据库的效果,下边代码记录备忘: package timmer; import java.util.Timer; import java.util.TimerTask; import mongoService.mongoServiceImp.AlarmServiceImpl; import com.mongodb.DBObject; public class StartTim {

java定时器-java的定时器ScheduledExecutorService调用问题,急!!!

问题描述 java的定时器ScheduledExecutorService调用问题,急!!! 我自己写了个java类,类中用了ScheduledExecutorService定时器自动执行任务,然后把这个工程弄成了一个jar包,然后写一个.bat去调用,程序启动之后会自动进行定时任务,但问题来了,我想写一个.bat能够停止正在执行的定时任务,该怎么做? 解决方案 taskkill /im java.exe 解决方案二: 不会啊 呵呵 解决方案三: java定时器

java定时器,如何避免下标越界

问题描述 java定时器,如何避免下标越界 timer.schedule(new TimerTask() { @Override public void run() { Log.i("colorIndex", colorIndex + ""); if (colorIndex > 4) { colorIndex = 0; }else{ colorIndex++; } turnningColor = syColors[colorIndex]; postInvali

基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置

经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - 静态资源.视图和消息器>两篇博文的介绍,我们已经配置好了Spring所需的基本配置.在这边博文中,我们将介绍怎么使用这些配置到实际项目中,并将web.xml文件替换为一个Java类. 我们使用Java代码来配置Spring,目的就是使我们的这些配置能够复用,对于这些配置的复用,我们采用继承和引入来实现

java Spring 5 新特性函数式Web框架详细介绍_java

java Spring 5 新特性函数式Web框架 举例 我们先从示例应用程序的一些摘录开始.下面是暴露Person对象的响应信息库.很类似于传统的,非响应信息库,只不过它返回Flux<Person>而传统的返回List<Person>,以及返回Mono<Person>的地方返回Person.Mono<Void>用作完成标识:指出何时保存被完成. public interface PersonRepository { Mono<Person> g