java定時任務調度工具
一、什麽是定時任務調度
基於給定的時間點,給定的時間間隔或者給定的時間執行次數自動執行的任務。
二、java中常用的定時任務調度工具:
- Timer
- Quartz
2.1兩者區別:
- Timer源自jdk,Quartz需要額外引入jar包。
- Timer功能少,使用方便,能解決許多常見問題。Quartz功能強大,使用麻煩,能解決幾乎所有問題。
- Timer底層通過線程執行定時任務。Quartz底層通過多個線程池執行定時任務。
2.2Timer簡介
定義:有且僅有一個後臺線程對多個業務線程,進行定時定頻率的調動。
構建:Timer有四個組成部分:
- Timer:定時任務調度工具主類。
- TimerTask:定時任務,裏面有run方法
- TimerThread:後臺負責執行的定時線程
- TaskQueue:定時任務隊列
其中最重要的部分為Timer和TimerTask。
Timer使用方法:
/** * 定義TimerTask */ class MyTimerTask extends TimerTask{ private String name; public MyTimerTask(String name) { this.name = name; } public void setName(String name) { this.name = name; } public String getName() { return name; } @Override public void run() { System.out.println("current exec name:" + new Date() + " " + name); } }
public class Main { public static void main(String[] args) throws ParseException { SimpleDateFormat sdf= new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); //1.創建一個timer Timer timer = new Timer(); //2.創建一個timerTask TimerTask task = new MyTimerTask("first"); //設定調用頻率 // timer.schedule(task, sdf.parse("2018/3/24 10:42:30"));//Date time 在執行的時間執行,如果時間已經過去了,則會立即執行。不會重復執行 // timer.schedule(task, 1000L);//Long delay 延遲指定的毫秒數後執行。不會重復執行 // timer.schedule(task, sdf.parse("2018/3/24 10:42:30"), 1000L);//Date firstTime, Long period 指定第一次的執行時間,如果時間已經過去了,則會立即執行,之後在指定的毫秒數後再次執行 // timer.schedule(task, 2000L, 1000L);//Long delay, Long period 第一次執行延遲delay毫秒,之後每隔period秒重復執行。 // timer.scheduleAtFixedRate(task, sdf.parse("2018/3/24 10:50:10"), 10000L);//指定第一次的執行時間,之後在指定的毫秒數後再次執行,如果時間已經過去了,會對這期間的線程進行補充執行,存在並發的可能 timer.scheduleAtFixedRate(task, 1000L, 10000L); } }
在Timer類中,執行定時任務的方法名主要分為scheduleAtFixedRate和schedule。兩者區別:
1、schedule方法不會對錯過的任務補充執行。scheduleAtFixtedRate發發會對錯過的任務進行補充執行。
例如:假如有定時任務12:00:00執行,之後每2秒重復執行。但當前時間已經是12:10:00。則schedule會立即對task執行一次,之後每間隔兩秒重復執行,scheduleAtFixedRate會立即對task執行10*60/2次,之後會以12:00:00的間隔時間開始執行。
2、schedule重復執行的時間從上一次任務執行結束時間開始。scheduleAtFixedRate重復執行的時間從上一次任務開始執行的時間開始。
例如:有定時任務執行需要6秒的時間,兩次任務之間的間隔是5秒。則schedule第一次執行時間12:00:00,第二次執行時間12:00:11。scheduleAtFixedRate第一次執行時間12:00:00,第二次執行時間12:00:05。
綜上,使用scheduleAtFixedRate時,需要考慮線程並發的問題。
其他的重要方法:
TimerTask.cancel():執行本地task後,取消當前定時任務調度。
TimerTask.schedule():返回最近執行這項任務被調度的時間。
Timer.cancel():終止當前定時器,取消定時器內所有的待執行任務。
Timer.purge():從定時器中移出所有已取消的任務,返回取消數量。
2.3Timer的缺陷
- 由於只有一個後臺線程,因此不支持多線程並發。即如果一個定時器中有多個定時任務,同一時間開始執行,則它們的開始執行時間不一定相同。
- 當其中一個任務拋出運行時異常,整個定時器會停止所有任務將拋出異常。
java定時任務調度工具