Go语言协程并发---timer秒表与定时器

秒表

package main

import (
        "fmt"
        "time"
)

/*每秒大喊我要去浪,共9次,然后退出计时*/

func main() {
        var tickerStopped = false
        ticker := time.NewTicker(time.Second)
        go func() {
                time.Sleep(9 * time.Second)
                ticker.Stop()
                tickerStopped = true
        }()
        for {
                if tickerStopped {
                        break
                }

                //每次阻塞1秒
                <-ticker.C
                fmt.Println("我要去浪")
        }

        fmt.Println("main over")
}

定时器

package main

import (
        "fmt"
        "os"
        "time"
)


/*三秒后宣布*/
func main051() {
        timer := time.NewTimer(3 * time.Second)
        fmt.Println("计时开始", time.Now())
        x := <- timer.C //时间管道
        fmt.Println("引爆于", x)

        fmt.Println("罗志祥的时间管理")
}


/*简易实现方式*/
func main052() {
        fmt.Println("计时开始", time.Now())
        x:=<-time.After(3*time.Second)
        fmt.Println("引爆于", x)
        fmt.Println("罗志祥的时间管理")
}

/*定时器的终止*/
func main053() {
        timer := time.NewTimer(5 * time.Second)
        fmt.Println("计时开始",time.Now())
        go func() {
                time.Sleep(3*time.Second)
                //停止计时器(永远不会向timer.C中写入数据了)
                ok := timer.Stop()
                if ok{
                        fmt.Println("炸弹已拆除")
                        os.Exit(0)
                }
        }()

        //阻塞5秒
        endTime := <-timer.C
        fmt.Println("炸弹引爆于", endTime)
}

/*定时器重置*/
func main054() {
        timer := time.NewTimer(5 * time.Second)
        fmt.Println("计时开始",time.Now())

        time.Sleep(time.Second)
        //以当前时间为基准(而不是timer被创建的时间),将定时器设置为2秒
        timer.Reset(2*time.Second)

        //阻塞5秒
        endTime := <-timer.C
        fmt.Println("炸弹引爆于", endTime)
}


/*爆炸后重置定时器*/
func main() {
        timer := time.NewTimer(3 * time.Second)
        fmt.Println("计时开始",time.Now())

        //睡眠期间,timer.C已经被写入时间
        time.Sleep(5*time.Second)
        //以当前时间为基准(而不是timer被创建的时间),将定时器设置为2秒
        timer.Reset(2*time.Second)

        //阻塞5秒
        endTime := <-timer.C
        fmt.Println("炸弹引爆于", endTime)
}