龙空技术网

java 和 go 的定时器对比

雨竹165179353 152

前言:

目前我们对“javatimer定时”可能比较关心,同学们都想要剖析一些“javatimer定时”的相关文章。那么小编也在网摘上网罗了一些对于“javatimer定时””的相关资讯,希望各位老铁们能喜欢,咱们一起来了解一下吧!


在做监控系统的时候,用到了定时任务来定时获取一些硬件的数据。于是就对比了一下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一起使用。

标签: #javatimer定时