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

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