Go语言实现定时器的方法详解

本文主要介绍了Go语言实现定时器的两个方法,包括一次性定时器(Timer)和周期性定时器(Ticker),一次性定时器:newTimer()创建一个能够往当前通道在持续duration时间之后发送当前时间的Timer。

Timer

Timer是一种单一事件的定时器,即经过指定的时间后触发一个事件,因为Timer只执行一次就结束,所以称为单一事件,这个事件通过其本身提供的channel进行通知触发。

使用示例

package main
 
import (
    "fmt"
    "time"
)
 
func main() {
    //1. timer基本使用
    timer1 := time.NewTimer(4 * time.Second)
    t1 := time.Now()
    fmt.Printf("t1:%v\n", t1)
    t2 := <-timer1.C
    fmt.Printf("t2:%v\n", t2)
    fmt.Println("2s到了")
 
    //2. timer只能响应1次, 到截止时间会将时间发给通道
    //timer2 := time.NewTimer(time.Second)
    //for {
    //    <-timer2.C
    //    fmt.Println("时间到", t2)
    //}
 
    // 3.timer实现延时的功能
    time.Sleep(time.Second)
    fmt.Println(time.Now())
    timer3 := time.NewTimer(2 * time.Second)
    <-timer3.C
    fmt.Println("2秒到了")
    fmt.Println(time.Now())
    <-time.After(2 * time.Second)
    fmt.Println("2秒到了")
 
    // 4.停止定时器
    timer4 := time.NewTimer(4 * time.Second)
    b := timer4.Stop()
    if b {
        fmt.Println("timer4关闭")
    }
 
    // 5.重置定时器
    timer5 := time.NewTimer(5 * time.Second)
    timer5.Reset(3 * time.Second)
    fmt.Println(time.Now())
    fmt.Println(<-timer5.C)
    time.Sleep(time.Second * 30)
}

Tiker

Tiker是一个定时触发的计时器,它会以一个间隔(interval)往通道发送当前时间,而通道的接收者可以以固定的时间间隔从通道中读取时间:

package main
 
import (
    "fmt"
    "time"
)
 
func main() {
    // 1.获取ticker对象
    ticker := time.NewTicker(2 * time.Second)
    i := 0
    // 子协程
    go func() {
        for {
            i++
            fmt.Println(<-ticker.C)
            if i == 4 {
                //停止ticker
                ticker.Stop()
            }
        }
    }()
    time.Sleep(time.Second * 20)
}

原文地址:https://blog.csdn.net/qq_39445165/article/details/124285999