专业的JAVA编程教程与资源

网站首页 > java教程 正文

java 和 go 的定时器对比(java定时器和多线程的区别)

temp10 2024-10-26 15:20:14 java教程 10 ℃ 0 评论


在做监控系统的时候,用到了定时任务来定时获取一些硬件的数据。于是就对比了一下go的定时任务实现和java的定时任务实现。这里只是对比了java的timer和go的time.NewTicker(),time.After().

java 和 go 的定时器对比(java定时器和多线程的区别)

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

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表