定时器Timer和Ticker

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 {}
}

你可能感兴趣的:(golang定时器)