一、定时器简介
Timer概述 :Timer是一个定时器。代表未来的一个单一事件,你可以告诉timer你要等待多长时间
type Timer struct {
C <- chan Time
r runtimeTimer
}
Timer结构体原理 : 它提供一个channel,在定时时间到达之前,没有数据写入timer.C会一直阻塞。直到定时时间到,向channel写入值,阻塞解除,可以从中读取数据
二、定时器原理
Timer创建 :创建定时器,指定定时时长,定时到达后;系统会自动向定时器的成员 C 写 系统当前时间。 (对 chan 的写操作)Timer读取 :读取Timer.C得到定时后的系统时间。并且完成一次 chan 的读操作
package main
import (
"fmt"
"time"
)
func main ( ) {
fmt. Println ( "当前时间:" , time. Now ( ) )
myTimer := time. NewTimer ( time. Second * 2 )
nowTime := <- myTimer. C
fmt. Println ( "现下时间:" , nowTime)
}
三、三种定时方法
package main
import (
"fmt"
"time"
)
func main ( ) {
time. Sleep ( time. Second)
myTimer := time. NewTimer ( time. Second * 2 )
nowTime := <- myTimer. C
fmt. Println ( "现下时间:" , nowTime)
fmt. Println ( "当前时间:" , time. Now ( ) )
nowTime2 := <- time. After ( time. Second * 2 )
fmt. Println ( "现下时间:" , nowTime2)
}
四、定时器的停止和重置
定时器停止 :myTimer.Stop
——将定时器归零,<-myTimer.C
会阻塞定时器重置 :myTimer.Reset(time.Second)
package main
import (
"fmt"
"time"
)
func main ( ) {
myTimer := time. NewTimer ( time. Second * 10 )
myTimer. Reset ( 1 * time. Second)
go func ( ) {
for {
<- myTimer. C
fmt. Println ( "子go程,定时完毕" )
}
} ( )
for {
}
}
五、周期定时器
type Ticker struct {
C <- chan Time
r runtimeTimer
}
创建周期定时器 :myTicker := time.NewTicker(time.Second)
定时时长到达后,系统会自动向 Ticker 的 C 中写入 系统当前时间 每隔一个定时时长后,循环写入系统当前时间
package main
import (
"fmt"
"time"
)
func main ( ) {
quit := make ( chan bool )
fmt. Println ( "now: " , time. Now ( ) )
myTicker := time. NewTicker ( time. Second)
i := 0
go func ( ) {
for {
nowTime := <- myTicker. C
i++
fmt. Println ( "nowTime:" , nowTime)
if i == 3 {
quit <- true
break
}
}
} ( )
<- quit
}