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();


分享到:


相關文章: