JAVA定時任務系列(二、JDK原生定時工具:Timer)


接上文......

四、JDK原生定時工具:Timer

(1) Timer介紹

所在包:

java.util.Timer
java.util.TimerTask
Timer(后台執行線程)對TimerTask(業務線程)的定時調用

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

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

public abstract class TimerTask implements Runnable

  • Timer定時器實例有多種構造方法:
  • 創建一個新計時器: Timer()
  • 創建一個新計時器,可以指定其相關的線程作為守護程序運行: Timer(boolean isDaemon)
  • 創建一個新計時器,其相關的線程具有指定的名稱: Timer(String name)
  • 創建一個新計時器,其相關的線程具有指定的名稱,並且可以指定作為守護程序運行:Timer(String name, boolean isDaemon)

(2) Timer執行流程圖

(3) 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()兩者的區別:

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

Timer注銷

timer.cancel();

(4) Timer案例

(4.1) 特定時間后執行

public void schedule(TimerTask task,long delay)

參數說明:

  • task為:執行任務
  • delay:時間毫秒數

方法的含義:
在delay毫秒后執行任務task,只執行一次。

(4.2) 案例一

1分鍾后同步數據。

案例實現:

  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.");        
    }

}
  1. 定時任務:
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);
    }

}

(4.3) 案例二

按點吃飯

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

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);
    }
}

JAVA定時任務系列

JAVA定時任務系列(一、基於注解,基於接口)
JAVA定時任務系列(二、JDK原生定時工具:Timer)
JAVA定時任務系列(三、定時任務框架Quartz)


免責聲明!

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



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