Java定時器Timer學習之一

種類:java

  1. 接通延時型定時器:接通延時型定時器是各類PLC(可編程控制器)中最多見最基本的定時器,這種定時器在Siemens的PLC中,成爲SD型定時器
  2. 斷開延時型定時器:這種定時器是當輸入條件00000爲ON時無延時做用,只有在輸入條件00000爲OFF時產生延時做用.在siemens的PLC中,稱爲SF型定時器
  3. 保持型接通延時定時器:這種定時器是當輸入條件00000爲ON後,即產生鎖存功能,即便輸入條件00000又變爲OFF,仍視輸入條件位ON,當定時器的當前值等於設定值時,定時器動做,這種定時器在Simens的PLC中,稱爲SS型定時器
  4. 脈衝型定時器:這種定時器是當輸入條件00000爲ON後,定時器即時動做,但通過定時器所設定的時間後,即便輸入條件00000仍未ON,定時器卻變爲OFF狀態.即這種定時器ON狀態的維持時間是由設定值決定的.若是00000爲ON的時續時間小於定時器的設定值,定時器的ON狀態維持時間爲輸入田間00000爲ON的持續時間.這種定時器在Siemens的PLC中,稱爲SP型定時器
  5. 擴張型脈衝定時器:這種定時器與脈衝型定時器的區別是,最後要輸入條件00000出現了ON狀態,無論其持續時間多長,都可使定時器爲ON的維持的時間與定時器的設定值一致.這種定時器在Siemens的PLC中,稱爲SE型定時器

在Java中會存在每隔必定時間去執行某個任務的現象,如:天天定時清理服務器上的日誌文件,天天定時上傳文件或下載文件等。在Java中要實現定時任務,須要使用Timer類編程

Timer的定義:安全

有且僅有一個後臺線程對多個業務進行定時定頻的調度。Timer類能夠保證多個線程能夠共享單個Timer對象而無需進行外部同步,因此Timer類是線程安全的服務器

核心的兩個類:ide

  • java.util.Timer和java.util.TimerTask
  • java.util.Timer。其實是個線程,定時調度所擁有的TimerTasks
  • 一個TimerTask實際上就是一個擁有run()方法的類,須要定時執行的代碼放到run方法體內,TimerTask通常是以匿名類的方式建立。
  • TimerTask類是一個定時任務類,該類實現了Runnable接口,並且是一個抽象類

說明測試

java.util.TimerTaskthis

TimerTask是一個抽象類,由Timer安排爲一次執行或重複執行的任務。.net

public abstract class TimerTask implements Runnable 它有一個抽象方法run()方法,該方法用於執行相應計時器任務要執行的操做。所以每個具體的任務類都必須繼承TimerTask,而後重寫run()方法。線程

另外它還有兩個非抽象的方法:日誌

  • boolen cancel(): 取消此計時器任務
  • long scheduledExecutionTime(): 返回此任務最近實際執行的安排執行時間。

java.util.Timer

注意:javax.swing包中也有一個Timer類,若是import中用到swing包,要注意名字的衝突。

Timer定時器實例有多種構造方法;

  • Timer():建立一個新定時器
  • Timer(boolean isDaemon):建立一個新定時器,能夠指定其相關的線程做爲守護程序運行。
  • Timer(String name):建立一個新定時器,其相關的線程具備指定的名稱
  • Timer(String name,boolean isDaemon):建立一個新計時器,其相關的線程具備指定的名稱,而且能夠指定做爲守護程序運行

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()

  • scheduleAtFixedRate(TimerTask task,Date firstTime,long period):安排指定的任務在指定的時間開始進行重複的固定速率執行。

實例代碼說明:

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

}

輸入結果:

  • current exec time is:2018-06-05 14:35:22
  • Current exec name is:No.1
  • current exec time is:2018-06-05 14:35:23
  • Current exec name is:No.1
  • current exec time is:2018-06-05 14:35:24
  • Current exec name is:No.1

schedule()的用法

代碼緊跟上面的例子來作。

  • purge()從定時器任務隊列中移除全部已取消的任務
  • 應用實例:
相關文章
相關標籤/搜索