Golang学习笔记:定时器

本文详细介绍了Go语言中的计时器Timer和Ticker的使用方法及原理,包括初始化、停止、重置以及循环发送机制。通过具体示例,帮助读者理解如何在实际编程中运用这些计时工具。

转载请注名出处:https://blog.youkuaiyun.com/sublio/article/details/106477855

全系列目录:https://blog.youkuaiyun.com/sublio/article/details/106480267

Timer和Ticker

目录

Timer和Ticker

Timer(一次)

Ticker(循环)

参考文档


Timer(一次)

  1. 不能直接用复合字面量来初始化(有一个包级的私有字段,不能忽略它的初始化,由于是包级别的,也不能在外面初始化)。

  2. time.NewTimer(time.Duration)初始化。

    1. 例子:timer := time.NewTimer(3 * time.Hour + time.Minute)

    2. 到期后向其通知通道(timer.C)发送到期的绝对到期时间(初始化时间 + 相对到期时间)。

    3. timer.C是类型为chan time.Timer的接受通道(定时器内部为双向,可以向它发送元素)。

    4. timer.C的长度为1。

    5. time.NewTimer(time.Duration).C等价于time.After(time.Duration)。

  3. time.AfterFunc(d Duration, f func())

    1. 第一个参数表示相对到期时间。

    2. 第二个参数表示到期时需要执行的函数。

    3. 到期后不会向通知channel发送通知,而是启用一个goroutine调用传入的函数。

  4. Timer.Stop

    1. 返回一个bool值。

    2. 返回false时表示 定时器已经过期;已经被停止。

    3. 在定时器到期之前Stop返回true,之后C就没有机会缓冲任何元素了(重置之后又可以了),如果此时C里面有一个元素值,它就会一直在那里,直到被接收,之后再想从里面接收任何元素是不会有结果的,还会导致goroutine的永久阻塞,因此在重置之前一定不要对其进行接收操作。

  5. Timer.Reset

    1. 返回值的含义与Stop一样。

    2. 返回值与重制是否成功无关。

    3. 定时器到期后,如果C里面旧的通知没有被接收走,该字段就会缓冲着这个元素值,重置之后也还是在里面,由于C的长度为1,重置之后到期的新通知会被丢弃(不会导致堵塞),因此,想要复用必须要保证旧的通知被接收掉。

  6. 相对到期时间应该传入正整数,不然没有意义。

Ticker(循环)

  1. time.NewTicker(time.Duration)初始化。

  2. Timer.Stop和timer的功能相似,一旦停止,它就不会向C发送任何元素值了,如果此时C里面有一个元素值,它就会一直在那里,直到被接收。

  3. 没隔周期时间就会向C进行一次发送操作,C的长度为1,如果下次发送的时候发现C还未被接收,就取消发送操作(这一点与timer一致)。

 

参考文档

《Go并发编程实战(第2版)》——郝林

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值