Java基礎--定時任務Timer

一、Timer介紹

 java.util.Timer

 java.util.TimerTask

Timer是一個定時器類,通過該類可以爲指定的定時任務進行配置。TimerTask類是一個定時任務類,該類實現了Runnable接口,而且是一個抽象類,如下所示:

  public abstract class TimerTask implements Runnable

  可以通過繼承該類,來實現自己的定時任務。

  Timer定時器實例有多種構造方法:

  Timer()

  創建一個新計時器。

  Timer(boolean isDaemon)

  創建一個新計時器,可以指定其相關的線程作爲守護程序運行。

  Timer(String name)

  創建一個新計時器,其相關的線程具有指定的名稱。

  Timer(String name, boolean isDaemon)

  創建一個新計時器,其相關的線程具有指定的名稱,並且可以指定作爲守護程序運行。

二、Timer方法

定時執行方法

1、在特定時間執行任務,只執行一次

public void schedule(TimerTask task,Date time)

2、在特定時間之後執行任務,只執行一次

public void schedule(TimerTask task,long delay)

3、指定第一次執行的時間,然後按照間隔時間,重複執行

public void schedule(TimerTask task,Date firstTime,long period)

4、在特定延遲之後第一次執行,然後按照間隔時間,重複執行

public void schedule(TimerTask task,long delay,long period)

參數:

delay: 延遲執行的毫秒數,即在delay毫秒之後第一次執行

period:重複執行的時間間隔

5、第一次執行之後,特定頻率執行,與3同

public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period)

6、在delay毫秒之後第一次執行,後按照特定頻率執行

public void scheduleAtFixedRate(TimerTask task,long delay,long period)

方法名稱schedule()和scheduleAtFixedRate()兩者的區別

<1>schedule()方法更注重保持間隔時間的穩定:保障每隔period時間可調用一次
<2>scheduleAtFixedRate()方法更注重保持執行頻率的穩定:保障多次調用的頻率趨近於period時間,如果任務執行時間大於period,會在任務執行之後馬上執行下一次任務

Timer註銷

timer.cancel();

三、案例

1、特定時間後執行

public void schedule(TimerTask task,long delay)

參數:

task爲:執行任務

delay:時間毫秒數

方法的含義:

在delay毫秒後執行任務task,只執行一次。

案例:

1分鐘後同步數據。

同步任務:

複製代碼
package com.yank.framework.common;

import java.util.TimerTask;

public class SynchroTimerTask extends TimerTask {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("Synchro data to other servers.");        
    }

}
複製代碼

定時任務:

複製代碼
package com.yank.framework.common;

import java.util.Timer;
import java.util.TimerTask;

public class SynchroTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        TimerTask task = new SynchroTimerTask();        
        Timer timer = new Timer();        
        timer.schedule(task, 1000);
    }

}
複製代碼

 

 2、案例2:按點吃飯

首先定義吃飯的任務,制定飯點,沒小時進行檢查,到點就吃飯。

複製代碼
package com.yank.framework.common;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.TimerTask;

/*
 * 定時吃飯
 * */
public class EatTimerTask extends TimerTask {
    
    //吃飯時間
    private static List<Integer> eatTimes;
    /*
     * 靜態初始化
     * */
    static {
        initEatTimes();
    }
    
    /*
     * 初始化吃飯時間
     * */
    private static void initEatTimes(){
        eatTimes = new ArrayList<Integer>();
        eatTimes.add(8);
        eatTimes.add(12);
        eatTimes.add(18);
    }

    /*
     * 執行
     * */
    @Override
    public void run() {
        // TODO Auto-generated method stub
        Calendar calendar = Calendar.getInstance();
        System.out.println("檢查是否到了吃飯的點");
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        if(eatTimes.contains(hour))
        {
            System.out.println("餓了,吃飯...");
        }
    }

}
複製代碼

 

定時檢查執行:

複製代碼
package com.yank.framework.common;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class EatTimerTaskTest {
    public static void main(String[] arg){
        TimerTask task = new EatTimerTask();
        Calendar  calendar= Calendar.getInstance();    
        
        
        Date firstTime = calendar.getTime();
        //間隔:1小時
        long period = 1000 * 60 * 60;    
        //測試時間每分鐘一次
        //period = 1000 * 60;        
        
        Timer timer = new Timer();        
        timer.schedule(task, firstTime, period);
    }
}


發佈了31 篇原創文章 · 獲贊 19 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章