golang中的定时器
1. timer 定时器,时间到了执行,只执行一次
package main import ( "fmt" "time" ) func main() { // 1. timer基本使用 /* timer1 := time.NewTimer(2 * time.Second) t := time.Now() fmt.Printf("t = %v\n", t) t2 := <-timer1.C fmt.Printf("t2 = %v\n", t2) */ // 2. 验证timer只能响应一次 /* timer2 := time.NewTimer(time.Second) for { <-timer2.C // 第一次打印时间到,第二次就会死锁(原因:timer2定时器只往通道中发送一次Time数据) fmt.Println("时间到") } */ // 3. timer实现延时的功能 /* fmt.Println("开始了", time.Now()) time.Sleep(time.Second) fmt.Println("第一次延时:", time.Now()) timer3 := time.NewTimer(2 * time.Second) <-timer3.C fmt.Println("第二次延时:", time.Now()) <-time.After(3 * time.Second) // time.After() 就是对 NewTimer(d).C 的封装 fmt.Println("第三次延时:", time.Now()) */ // 4. 停止定时器 /* timer4 := time.NewTimer(2 * time.Second) go func() { <-timer4.C fmt.Println("定时器执行了") }() //time.Sleep(3 * time.Second) // 注意:如果定时器执行了,然后在调用timer4.Stop()就会返回false,如果没有执行就调用Stop()就会返回true // 定时器一旦被关闭,从定时器通道中读取数据和后面的代码将不会在执行 b := timer4.Stop() if b { fmt.Println("timer4已经关闭") } for { } */ // 5. 重置定时器 fmt.Println(time.Now()) timer6 := time.NewTimer(3 * time.Second) timer6.Reset(time.Second) fmt.Println(<-timer6.C) }
2. Ticker:时间到了,多次执行
package main import ( "fmt" "sync" "time" ) var wg sync.WaitGroup func main() { // 2. ticker 定时器,时间到了多次执行 ticker := time.NewTicker(1 * time.Second) wg.Add(1) go func() { i := 1 for { fmt.Println(<-ticker.C) if i == 5 { ticker.Stop() break } i++ } wg.Done() fmt.Println("子 goroutine结束了") }() wg.Wait() fmt.Println("主 goroutine 结束了...") }