在做監控系統的時候,用到了定時任務來定時獲取一些硬件的數據。於是就對比了一下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一起使用。
閱讀更多 雨竹165179353 的文章