定時器權威指針:
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();
閱讀更多 壞桃子 的文章