java 和 go 的定時器對比

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

       1. 延時執行的實現

       go的用法爲:

        timer := time.AfterFunc(1*time.Second, Add1)
	timer.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)
	timer.Stop()
	fmt.Println(timer)
	tick := time.NewTicker(3 * time.Second)
	for {
		select {
		case c := <-tick.C:
			fmt.Println(c)
			Add1()
		}
	}

        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一起使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章