四时宝库

程序员的知识宝库

golang 定时器详解——Timer和Ticker

定时器: time.Timer

Timer是一个定时器, 代表未来的一个单一事件, 你可以告诉timer你要等待多长时间, 它提供一个channel, 在将来的那个时间那个channel提供了一个时间值。

package main
import (
    "fmt"
    "time"
)
func main() {
    //创建定时器, 2秒后, 定时器就会向自己的C字节发送一个time.Time类型的元素值
    timer1 := time.NewTimer(time.Second * 2)
    t1 := time.Now() //当前时间
    fmt.Printf("t1: %v\n", t1) //显示当前时间
    //2s后, 往timer1.C写数据, 有数据后, 就可以读取
    t2 := <-timer1.C //读取数据
    fmt.Printf("t2: %v\n", t2)
    //如果只是想单纯的等待的话, 可以使用time.Sleep来实现
    timer2 := time.NewTimer(time.Second * 2)
    <-timer2.C
    fmt.Println("2s后")
    time.Sleep(time.Second * 2)
    fmt.Println("再一次2s后")
    <-time.After(time.Second * 2) //定时2s, 阻塞2s, 2s后产生一个事件, 往channel写内容
    fmt.Println("再在一次2s后")
    timer3 := time.NewTimer(time.Second)
    go func() {
        <-timer3.C
        fmt.Println("Timer 3 expired")
    }()
    stop := timer3.Stop() //停止定时器
    if stop {
    fmt.Println("Timer 3 stopped")
    }
    fmt.Println("before")
    timer4 := time.NewTimer(time.Second * 3) //原来设置3s
    timer4.Reset(time.Second * 1) //重新设置时间
    <-timer4.C
    fmt.Println("after")
}

延时的三种方法详解:

package main
import (
    "fmt"
    "time"
)
func main() {
    //延时第一种方法
    timer := time.NewTimer(2 * time.Second) //延时2s后打印一句话
    t1 := <-timer.C //读取延迟后的时间
    fmt.Println("时间到", t1)
    //延时第二种方法
    time.Sleep(2 * time.Second)
    fmt.Println("时间到")
    //延时的第三种方法
    /*
    <-time.After(2 * time.Second)
    fmt.Println("时间到")
    */
    t2 := <-time.After(2 * time.Second) //返回延时的时间
    fmt.Println("时间到", t2) //时间到 2018-10-19 23:15:54.1062001 +0800 CST m=+6.026000001
}

定时器停止

package main
import (
    "fmt"
    "time"
)
func main() {
    timer := time.NewTimer(3 * time.Second)
    go func() {
    <-timer.C
    fmt.Println("子协程可以打印了, 因为定时器的时间到了")
    }()
    defer timer.Stop() //停止定时器
    for {
    }
}

定时器重置

package main
import (
"fmt"
"time"
)
func main() {
    timer := time.NewTimer(3 * time.Second)
    ok := timer.Reset(1 * time.Second) //重新设置为1s
    fmt.Println("ok = ", ok)
    <-timer.C
    fmt.Println("时间到")
}

定时器: time.Ticker

Ticker是一个定时触发的计时器, 它会以一个间隔(interval)往channel发送一个事件(当前时间), 而channel的接收者可以以固定的时间间隔从channel中读取事件。

package main
import (
"fmt"
"time"
)
func main() {
    //创建定时器, 每隔1秒后, 定时器就会给channel发送一个事件(当前时间)
    ticker := time.NewTicker(time.Second * 1)
    i := 0
    go func() {
    for {
    <-ticker.C
    i++
    fmt.Println("i = ", i)
    if i == 5 {
    ticker.Stop() //停止定时器
    }
    }
    }()
    //死循环, 特定不让main goroutine结束
    for {
    }
}

timer和ticker区别:

使用timer定时器, 超时后需要重置, 才能继续触发。

ticker只要定义完成, 从此刻开始计时, 不需要任何其他的操作, 每隔固定时间都会触发。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接