七叶笔记 » golang编程 » golang中,time定时器详细指南(案例篇)

golang中,time定时器详细指南(案例篇)

定时器权威指针:

time.sleep() time.tick() time.after()

t:=time.Tick(time.Second*10);
fmt.Println("Tick");
<-t
fmt.Println("sleep state=>",time.Now().Unix());
time.Sleep(time.Second*4)
fmt.Println("sleep end=>",time.Now().Unix());
a:=time.After(time.Second*10);
s:=<-a;
fmt.Println(s);
 

time.tick(),time.after()几乎完全一样用法,主进程运行该代码后不会阻塞,后面的代码马上执行;

time.Sleep()用于阻塞当前进程,延迟执行后面代码。

time.after()与time.AfterFunc()

func main(){
 var t2 =time.AfterFunc(time.Second*2,bb);
 t2.Stop();
 fmt.Println(t2);
}
func bb() {
 fmt.Println("输出......")
 }
 

time.after()与time.afterFunc()最大区别是可以time.afterFunc().stop()停止,时间到了自动执行回调方法

time.NewTicker()与time.NewTimer()

//ticker
var ti *time.Ticker=time.NewTicker(time.Second*3);
var  cc =0;
out:for {
 fmt.Println("开始读取.....")
 select {
 case s := <-ti.C:
 cc++;
 if(cc>5){
 ti.Stop();
 break out;
 }
 fmt.Println("Ticker===>", s.Unix());
 }
}
//timer
var tt *time.Timer=time.NewTimer(time.Second*3);
var ca=0;
out1:for {
 fmt.Println("开始读取.....")
 select {
 case d := <-tt.C:
 ca++;
 if(ca>5){
 tt.Stop();
 break out1;
 }else {
 tt.Reset(time.Second*3);
 }
 fmt.Println("timer===>", d.Unix());
 }
}
 

time.newticker() 与time.newtimer() 都是用于重复定时任何,区别在于timer.C后会对该对象加上一个锁,必须使用Reset来释放锁,否则下次timer.C就报错。

time.newticker()用于间隔时间中包含ticker处理消耗时间,timer的间隔时间可以不包含timer处理消耗时间;

就是java 中的timer. schedule ()和timer.scheduleAtFixedRate();

相关文章