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

定时器权威指针:

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

t:=time.Tick(time.Second*10);
fmt.Println("Tick");
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:=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 := 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 := 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();