閱讀784 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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(), 10002000);//在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()), 010*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.項目的具體使用和感想
這隻是在項目的初步規劃.可能實行過程中還會出現很多問題.比如網絡和服務器重啟等...不過會在後麵開發中繼續努力改進.使其功能更加完善.

最後更新:2017-04-02 06:51:53

  上一篇:go AlertDialog使用實例
  下一篇:go [usaco]3.4.4 變形的動態規劃問題Electric Fence