CodeFun Go

Timer实现延迟执行

Timer 可以实现延时执行,和 time.Sleep 类似,但是前者可以通过关闭 Timer 取消阻塞。

NewTimer 创建一个新的 Timer,2 * time.Second是设定需要等待的持续时间片段。然后它将提供一个用于通知的通道 timer.C

timer := time.NewTimer(2 * time.Second)

<-timer.C 会一直阻塞。除非 timer 被关闭。

package main

import (
	"fmt"
	"time"
)

func main() {
	timer := time.NewTimer(2*time.Second)
	timer2 := time.NewTimer(2*time.Second)
	defer timer.Stop()
	fmt.Println("start", time.Now())
	go func() {
        t := <-timer.C
        fmt.Println("go", t)
    }()
	go func() {
        t := <-timer2.C
        fmt.Println("go2", t)
    }()
	fmt.Println("end", time.Now())
	
	// 提前终止 timer2
	if timer2.Stop() {
		fmt.Println("Stop Timer 2")
	}

	// 等待携程执行
	time.Sleep(3 * time.Second)
}
start 2021-11-19 11:18:04.491952 +0800 CST m=+0.000199876
end 2021-11-19 11:18:04.49217 +0800 CST m=+0.000417584
Stop Timer 2
go 2021-11-19 11:18:06.493336 +0800 CST m=+2.001604001