接上文......
四、JDK原生定時工具:Timer
(1) Timer介紹
所在包:
java.util.Timer
java.util.TimerTask
Timer(后台執行線程)對TimerTask(業務線程)的定時調用
Timer
是一個定時器類,通過該類可以為指定的定時任務進行配置。TimerTask
類是一個定時任務類,該類實現了Runnable
接口,而且是一個抽象類,如下所示:
可以通過繼承該類,來實現自己的定時任務。
public abstract class
TimerTask
implementsRunnable
- 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分鍾后同步數據。
案例實現:
- 同步任務:
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);
}
}
(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)