Java定時器


開頭簡單介紹Timer類:java.util.Timer類提供了工具,線程調度任務在后台線程中將來執行

  1. 這個類是線程安全的,即多個線程可以無需進行外部同步共享單個Timer對象
  2. 此類安排任務執行一次,或者定期重復執行
  3. 所有構造函數啟動一個計時器線程

定時器Java代碼:

 1 package com.yzj;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 import java.util.Timer;
 6 
 7 import javax.servlet.ServletContextEvent;
 8 import javax.servlet.ServletContextListener;
 9 
10 public class Test implements ServletContextListener
11 {
12 
13     private Timer timer = null;
14 
15     /**
16      * 容器初始化servlet時調用
17      */
18     public void contextInitialized(ServletContextEvent arg0)
19     {
20         timer = new Timer(true);
21         /*
22          * scheduleAtFixedRate()方法說明: 
23          * 參數1.要執行的任務
24          * 參數2.調用scheduleAtFixedRate方法后,要等待多長時間去第一次執行run()
25          * 參數3.第一次調用后,從第二次開始每隔多長時間再去調用run()
26          */
27         timer.scheduleAtFixedRate(new TestTask(), 10 * 1000, 30 * 1000);
28         System.out.println("開始執行contextInitialized()的時間:" + Test.getNow());
29     }
30 
31     /**
32      * servlet銷毀時調用
33      */
34     public void contextDestroyed(ServletContextEvent arg0)
35     {
36         if (timer != null)
37         {
38             timer.cancel();
39         }
40     }
41 
42     public static String getNow()
43     {
44         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
45         return sdf.format(new Date());
46     }
47 }
Test.java
 1 package com.yzj;
 2 
 3 import java.util.TimerTask;
 4 
 5 public class TestTask extends TimerTask
 6 {
 7     private static boolean isRunning = false;
 8 
 9     int x = 0;
10 
11     @Override
12     public void run()
13     {
14         x += 1;
15         System.out.println("第" + x + "次執行run()的時間:" + Test.getNow());
16         if (!isRunning)
17         {
18             isRunning = true;
19             System.out.println("開始執行任務。");
20             int i = 0;
21             while (i++ < 10)
22             {
23                 System.out.println("已完成任務的" + i + "/" + 10);
24             }
25             isRunning = false;
26             System.out.println("任務執行結束。");
27         }
28         else
29         {
30             System.out.println("上一次任務執行還未結束,本次任務不能執行。");
31         }
32     }
33 }
TestTask.java

web.xml配置

<listener>
    <listener-class>com.yzj.Test</listener-class>
</listener>

上圖可以看出,scheduleAtFixedRate的第二個參數和第三個參數的區別

-------------------------------------------------------------------------------------------------

最后簡單說明schedule和scheduleAtFixedRate的區別:

    schedule()  方法用於安排指定的任務進行重復的固定延遲執行,在指定的延遲后開始。

    scheduleAtFixedRate()  方法用於安排指定的任務進行重復的固定速率執行,在指定的延遲后開始。

通俗講就是:

    schedule()  如果第一次執行時間被delay了,隨后的執行時間按照上一次實際執行完成的時間點計算

    scheduleAtFixedRate()  如果第一次執行時間被delay了,隨后的執行時間按照上一次開始的時間點進行計算,它會為了catch up,會多次執行任務,TimerTask中的執行體需要考慮同步

    當執行任務的時間大於周期間隔時,

    schedule()  下一次執行的時間相對於上一次實際執行完成的時間點,因此執行時間會不斷延后

    scheduleAtFixedRate()  下一次執行的時間相對於上一次開始的時間點,因此執行時間不會延后,存在並發性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM