关于golang:定时器Timer和Ticker

11次阅读

共计 1284 个字符,预计需要花费 4 分钟才能阅读完成。

Timer

Timer 是一个定时器,代表将来的一个 繁多 事件,通过 Timer 自身提供的管道将事件传递进来,话中有话是只执行一次。

Timer 的数据结构如下:

type Timer struct {
    C <-chan Time
    r runtimeTimer
}
package main

import (
    "fmt"
    "time"
)

func main() {
    // 1.timer 根本应用
    timer1 := time.NewTimer(2 * time.Second)
    t1 := time.Now()
    fmt.Printf("以后工夫为:%v\n", t1)
    // 从定时器拿工夫数据
    t2 := <-timer1.C
    fmt.Printf("定时两秒后:%v\n", t2)

    // 2. 验证 timer 只能响应 1 次
    timer2 := time.NewTimer(time.Second)
    for {
    <-timer2.C
    fmt.Println("工夫到,以后 for 循环不再执行")
    }

    // 3.timer 实现延时的性能
    //(1)休眠一秒钟
    time.Sleep(time.Second)
    //(2)定时两秒钟
    timer3 := time.NewTimer(2 * time.Second)
    <-timer3.C
    fmt.Println("定时 2 秒到")
    //(3)延时两秒钟
    <-time.After(2*time.Second)
    fmt.Println("延时 2 秒到")

    // 4. 进行定时器
    timer4 := time.NewTimer(2 * time.Second)
    go func() {
    <-timer4.C
    fmt.Println("定时器执行了")
    }()
    // 进行定时器
    b := timer4.Stop()
    if b {fmt.Println("timer4 曾经进行")
    }

    // 5. 设置定时为三秒钟
    timer5 := time.NewTimer(3 * time.Second)
    // 重置定时器为一秒钟
    timer5.Reset(1 * time.Second)
    fmt.Println(time.Now())
    fmt.Println(<-timer5.C)

    for {}}

Ticker

Ticker 是周期性定时器,即周期性的触发一个事件,通过 Ticker 自身提供的管道将事件传递进来,话中有话是能够反复执行。

Ticker 的数据结构:

type Ticker struct {
    C <-chan Time
    r runtimeTimer
}
package main

import (
    "fmt"
    "time"
)

func main() {
    //// 1. 有限定时循环
    //ticker := time.NewTicker(1 * time.Second)
    //defer ticker.Stop()
    //for range ticker.C {//    fmt.Println("滴答滴答滴答")
    //}

    // 2. 限定循环次数执行
    ticker := time.NewTicker(1 * time.Second)
    defer ticker.Stop()
    i := 0
    // 子协程
    go func() {
        for {
            i++
            fmt.Println(<-ticker.C)
            if i == 5 {
                // 进行
                ticker.Stop()}
        }
    }()
    for {}}
正文完
 0