種類:java
在Java中會存在每隔必定時間去執行某個任務的現象,如:天天定時清理服務器上的日誌文件,天天定時上傳文件或下載文件等。在Java中要實現定時任務,須要使用Timer類編程
Timer的定義:安全
有且僅有一個後臺線程對多個業務進行定時定頻的調度。Timer類能夠保證多個線程能夠共享單個Timer對象而無需進行外部同步,因此Timer類是線程安全的服務器
核心的兩個類:ide
說明測試
java.util.TimerTaskthis
TimerTask是一個抽象類,由Timer安排爲一次執行或重複執行的任務。.net
public abstract class TimerTask implements Runnable
它有一個抽象方法run()方法,該方法用於執行相應計時器任務要執行的操做。所以每個具體的任務類都必須繼承TimerTask,而後重寫run()方法。線程
另外它還有兩個非抽象的方法:日誌
java.util.Timer
注意:javax.swing包中也有一個Timer類,若是import中用到swing包,要注意名字的衝突。
Timer定時器實例有多種構造方法;
Timer定時器的schedule()(調度方法)
下面例子部分參數說明:
delay:延遲執行的毫秒數,即在delay毫秒以後第一次執行
period:重複執行的時間間隔
Timer類有四種使用方法:
/* time爲Date類型:在指定時間執行一次。 */ timer.schedule(task, time); /* firstTime爲Date類型,period爲long 從firstTime時刻開始,每隔period毫秒執行一次。 */ timer.schedule(task, firstTime, period); /* delay 爲 long類型:從如今起過delay毫秒執行一次 */ timer.schedule(task, delay) /* delay 爲 long, period 爲 long:從如今起過delay毫秒之後,每隔 period 毫秒執行一次。*/ timer.schedule(task, delay, period)
**方法名稱schedule()和scheduleAtFixedRate()的區別: **
schedule()方法跟注重保持間隔時間的穩定:保障每隔period時間可調用一次
scheduleAtFixedRate()方法更注重保持執行頻率的穩定:保障屢次調用的頻率趨近於period時間,若是任務執行時間大於period,會在任務執行以後立刻執行下一次任務
scheduleAtFixedRate()
實例代碼說明:
MyTimerTask.java
做爲一個須要調度的任務類。
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.TimerTask; public class MyTimerTask extends TimerTask { private String name; public MyTimerTask(String inputName) { name = inputName; } [@Override](https://my.oschina.net/u/1162528) public void run() { Calendar calendar = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("current exec time is:"+ sf.format(calendar.getTime())); // 重寫來自於 TimerTask 的 run() System.out.println("Current exec name is:" + name); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
MyTimer.java
測試調度 MyTimerTask
import java.util.Timer; public class MyTimer { public static void main(String[] args) { // 建立一個 timer 實例 Timer timer = new Timer(); // 建立一個 MyTimerTask 實例 MyTimerTask myTimerTask = new MyTimerTask("No.1"); /* 經過 timer 定時定頻調用 myTimerTask的業務邏輯 * 即第一次執行是在當前時間的兩秒以後,以後每隔一秒執行一次 */ timer.schedule(myTimerTask, 2000L, 1000L); } }
輸入結果:
schedule()的用法
代碼緊跟上面的例子來作。