java 和 go 的定時器對比


java 和 go 的定時器對比

在做監控系統的時候,用到了定時任務來定時獲取一些硬件的數據。於是就對比了一下go的定時任務實現和java的定時任務實現。這裡只是對比了java的timer和go的time.NewTicker(),time.After().

1. 延時執行的實現

go的用法為:

timer := time.AfterFunc(1*time.Second, Add1)

\ttimer.Stop()

java的用法為:

//創建定時器對象

Timer t=new Timer();

//在3秒後執行MyTask類中的run方法

t.schedule(new MyTask(), 3000);

t.cancel();

java實現延時執行的定時器是需要先實現一個集成了TimerTask的類,然後通過Timer類創建一個定時器。在延遲3秒後執行,同時只執行一遍。

go實現延遲執行是調用time.AfterFunc()實現,通過這個函數有2個參數,一個是時間,一個執行的方法。

以上實現都是一次性的,也就是執行一次後就不會再執行。

2. 延遲執行+週期執行

go的用法為:

timer := time.AfterFunc(1*time.Second, Add1)

\ttimer.Stop()

\tfmt.Println(timer)

\ttick := time.NewTicker(3 * time.Second)

\tfor {

\t\tselect {

\t\tcase c :=
\t\t\tfmt.Println(c)

\t\t\tAdd1()

\t\t}

\t}

java的用法為:

//創建定時器對象

Timer t=new Timer();

//在3秒後執行MyTask類中的run方法

t.schedule(new MyTask(), 3000,5000);

在週期性的定時任務實現上,java相對比go的實現簡單,只需要在後面再加一個週期間隔時間的參數即可。

而go需要用到一個time.NewTicker(),他和AfterFunc不同在於,他是週期執行的,而AfterFunc只執行一次。在實現上是通過建立一個tick,然後執行死循環。tick會週期的往通道內放時間,我們只需要在循環內執行通道取值即可調用方法。由於tick第一次執行是延遲時間執行。啟動時並不會執行所以一般必須結合AfterFunc一起使用。


分享到:


相關文章: