時間任務調度,咱們必定不會陌生,那麼今天就來看看JDK中的時間任務調度工具Timer;java
什麼是定時任務調度:
基於給定的時間點,給定的時間間隔或者給定的執行次數 自動執行的任務;併發
Timer簡介: 有且僅有 一個後臺線程 對 多個業務線程 進行 定時定頻率的調度;ide
關於Timer的測試代碼:函數
1, 首先建立任務 MyTimerTask 繼承 TimerTask 重寫 run():工具
package timer; import java.text.SimpleDateFormat; import java.util.TimerTask; public class MyTimerTask extends TimerTask{ private String name; private int count = 0; public MyTimerTask() {} public MyTimerTask(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void run() { SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { //測試 schedule() 與 scheduleAtFixedRate() 區別: Thread.sleep(3000L); } catch (InterruptedException e) { e.printStackTrace(); } if(count<5){ System.out.println("當前Task名稱:" + name + ", 執行時間:" + sf.format(scheduledExecutionTime())); count++; } else { //結束當前任務 cancel(); System.out.println("TimerTask "+name+" is cancel(), count="+count+", 最後執行時間:"+ sf.format(scheduledExecutionTime())); } } }
2, Timer 調用測試:測試
package timer; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Timer; public class MyTimer { public static void main(String[] args) throws InterruptedException { Timer timer = new Timer(); MyTimerTask myTimerTask = new MyTimerTask("NO.1.1"); Calendar calender = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("當前時間: " + sf.format(calender.getTime())); // ------------schedule的四種用法---------- /** * 1, schedule(Task,Date time);在時間等於或着超過time的時候執行且執行一次task; */ //calender.add(Calendar.SECOND, 3); // timer.schedule(myTimerTask, calender.getTime()); /** * 2, schedule(task, Date firstTime, long period); 參數說明: task: 執行任務, * firstTime: 首次執行時間, period: 執行時間間隔(毫秒) 做用: * 時間等於或超過time時首次執行task,以後每隔period毫秒執行一次task; */ // myTimerTask.setName("NO.1.2"); // timer.schedule(myTimerTask, calender.getTime(), 2000L); /** * 3, schedule(TimerTask task, long delay); 做用: 等待 delay 毫秒後 執行且執行一次 * task */ // myTimerTask.setName("NO.1.3"); // timer.schedule(myTimerTask, 1000L); /** * 4, schedule(TimerTask task, long delay, long period) 做用: 等待 delay毫秒後 * 執行第一次 task,以後沒隔 period毫秒執行一次; */ // myTimerTask.setName("NO.1.4"); // timer.schedule(myTimerTask, 2000L, 1000L); // ---------------scheduleAtFixedRate的兩種用法--------------- /** * 5, scheduleAtFixedRate(TimerTask task, long delay, long period); 做用: * 與4相同; */ // myTimerTask.setName("NO.1.5"); // timer.scheduleAtFixedRate(myTimerTask, 2000L, 1000L); /** * 6, scheduleAtFixedRate(TimerTask task, Date firstTime, long period); * 做用: 與2相同; */ // myTimerTask.setName("NO.1.6"); // timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 2000L); // ---------------------------其餘函數用法------------------------------------ /** * 7, cancel(); 做用: 終止此計時器,丟棄全部當前已安排的任務; */ // MyTimerTask myTimerTask2 = new MyTimerTask("NO.2.1"); // timer.scheduleAtFixedRate(myTimerTask2, calender.getTime(), 2000L); // Thread.sleep(5000L); // timer.cancel(); // System.out.println("timer is cancel()"); /** * 8, purge(); 做用: 今後計時器的任務隊列中移除全部已取消的任務,並返回從隊列中移除的任務數; */ // myTimerTask2.cancel(); // int number = timer.purge(); // System.out.println("timer is purge() number=" + number); // ---------schedule 和 scheduleAtFixedRate的區別:------------- /* 1, 首次計劃執行的時間早於當前的時間時; */ //設置開始執行時間爲當前時間六秒前 // calender.add(Calendar.SECOND, -6); /** * 9, schedule(); * "fixed-delay", 若是第一次執行時間被delay了,隨後的執行時間按照上一次實際執行的時間點進行計算; */ // timer.schedule(myTimerTask, calender.getTime(), 1000L); /** * 10, scheduleAtFixedRate(); * "fixed-rate",若是第一次執行時間被delay了,隨後執行時間按照上一次開始時間點進行計算, * 而且爲了遇上進度會屢次執行任務,所以TimerTask中的執行體須要考慮同步; */ // timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 1000L); /* 2, 任務執行所需時間超出任務的執行週期間隔時; */ /** * 11, schedule(); * 下次執行時間相對上次實際執行完成的時間點,所以執行時間會不斷延後 * */ // timer.schedule(myTimerTask, calender.getTime(), 1000L); /** * 12, scheduleAtFixedRate(); * 下次執行時間相對上次實際執行開始的時間點,所以執行時間不會延後,存在併發性; * */ timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 1000L); //------------------Timer的缺陷及使用禁區---------------------- /** * 天生的兩種缺陷: * 1, 管理併發任務的缺陷; * Timer有且僅有一個線程去執行定時任務,若是存在多個任務,且任務時間過長,會致使執行效果與預期不符; * * 2, 當任務拋出異常時的缺陷; * 若是TimerTask拋出RuntimeException, Timer會中止全部的任務運行; * * 使用禁區: * 1, 對時效性要求較高的多任務併發做業; * * 2, 對複雜任務的調度; * */ } }