转载请注名出处:https://blog.csdn.net/sublio/article/details/106477855
全系列目录:https://blog.csdn.net/sublio/article/details/106480267
Timer和Ticker
目录
Timer(一次)
-
不能直接用复合字面量来初始化(有一个包级的私有字段,不能忽略它的初始化,由于是包级别的,也不能在外面初始化)。
-
time.NewTimer(time.Duration)初始化。
-
例子:timer := time.NewTimer(3 * time.Hour + time.Minute)
-
到期后向其通知通道(timer.C)发送到期的绝对到期时间(初始化时间 + 相对到期时间)。
-
timer.C是类型为chan time.Timer的接受通道(定时器内部为双向,可以向它发送元素)。
-
timer.C的长度为1。
-
time.NewTimer(time.Duration).C等价于time.After(time.Duration)。
-
-
time.AfterFunc(d Duration, f func())
-
第一个参数表示相对到期时间。
-
第二个参数表示到期时需要执行的函数。
-
到期后不会向通知channel发送通知,而是启用一个goroutine调用传入的函数。
-
-
Timer.Stop
-
返回一个bool值。
-
返回false时表示 定时器已经过期;已经被停止。
-
在定时器到期之前Stop返回true,之后C就没有机会缓冲任何元素了(重置之后又可以了),如果此时C里面有一个元素值,它就会一直在那里,直到被接收,之后再想从里面接收任何元素是不会有结果的,还会导致goroutine的永久阻塞,因此在重置之前一定不要对其进行接收操作。
-
-
Timer.Reset
-
返回值的含义与Stop一样。
-
返回值与重制是否成功无关。
-
定时器到期后,如果C里面旧的通知没有被接收走,该字段就会缓冲着这个元素值,重置之后也还是在里面,由于C的长度为1,重置之后到期的新通知会被丢弃(不会导致堵塞),因此,想要复用必须要保证旧的通知被接收掉。
-
-
相对到期时间应该传入正整数,不然没有意义。
Ticker(循环)
-
time.NewTicker(time.Duration)初始化。
-
Timer.Stop和timer的功能相似,一旦停止,它就不会向C发送任何元素值了,如果此时C里面有一个元素值,它就会一直在那里,直到被接收。
-
没隔周期时间就会向C进行一次发送操作,C的长度为1,如果下次发送的时候发现C还未被接收,就取消发送操作(这一点与timer一致)。
参考文档
《Go并发编程实战(第2版)》——郝林