定时器权威指针:
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();