golang并发编程-04-通道-02-定时器、断续器

@

1. 定时器

1.1 time.NewTimer

  • 语法
    创建一个定时器
time.NewTimer(N * time.Second)

该定时器到设定时间会向通道中写入一个当时时间。
而在此之间,线程会阻塞。

  • 示例

要求:
写一个定时器,设定五秒。
到达预定时间后,读出定时器写入通道的时间。

func main() {
//创建一个定时器,设置时间为5s
timer := time.NewTimer(5 * time.Second)
fmt.Printf("【孔明先生在睡觉】 时间: %d:%d \n", time.Now().Minute(),time.Now().Second())
//5s后,往timer.c写数据
t := <-timer.C //channel没有数据前后阻塞
fmt.Printf("【孔明先生睡醒了】 时间: %d:%d ", t.Minute(),t.Second())
}

输出

【孔明先生在睡觉】 时间: 37:56
【孔明先生睡醒了】 时间: 38:1

1.2 <-time.After()

  • 语法
<-time.After(N* time.Second)
  • 作用:
    阻塞线程N秒

  • 示例

说明:
启动一个协程定时5秒后输出
主线程放一个for循环计数

func main() {
fmt.Println("=========孔明先生睡了=========")
go myTimer()
for i:=0;i<10;i++{
fmt.Println(i)
time.Sleep(1*time.Second)
}
}
func myTimer(){
<-time.After(5* time.Second)
fmt.Println("*****叮铃铃******\n孔明先生起床了")
}

输出

=========孔明先生睡了=========
0
1
2
3
4
*****叮铃铃******
孔明先生起床了
5
6
7
8
9

1.3 停止

  • 语法
timer.Stop()
  • 示例
func main() {
timer := time.NewTimer(3 * time.Second)
go func() {
<-timer.C
fmt.Println("*****叮铃铃*****")
}()
//关闭定时器
timer.Stop()
fmt.Println("【闹钟被关了】")
time.Sleep(5*time.Second)
}

1.4 定时器重置

  • 语法
timer.Reset(5 * time.Second)

返回布尔值

  • 作用
    闹钟重置后,之前的失效,从重置时刻起重新计时

  • 示例

func main() {
fmt.Println("=========孔明先生睡了=========")
go myTimer()
for i:=0;i<15;i++{
fmt.Println(i)
time.Sleep(1*time.Second)
}
}
func myTimer() {
timer := time.NewTimer(5 * time.Second)
time.Sleep(4*time.Second)
flag := timer.Reset(8 * time.Second)
if flag {
fmt.Println("【闹钟重置成功】")
}
<-timer.C
fmt.Println("********叮铃铃**********\n孔明先生起床了")
}

输出:

=========孔明先生睡了=========
0
1
2
3
4
【闹钟重置成功】
5
6
7
8
9
10
11
12
********叮铃铃**********
孔明先生起床了
13
14

2 断续器

2.1 断续器使用

  • 作用:每隔N秒向通道中发一个时间

  • 语法

time.NewTicker(N * time.Second)

示例:

ticker := time.NewTicker(1 * time.Second)
  • 示例
func main() {
go myTimer()
time.Sleep(10*time.Second)
}
func myTimer(){
ticker := time.NewTicker(1 * time.Second)
fmt.Println("======== 长沟流月 白驹过隙 ========")
for {
t := <-ticker.C
fmt.Println("秒钟 = ",t.Second())
}
}

输出

======== 长沟流月 白驹过隙 ========
秒钟 = 27
秒钟 = 28
秒钟 = 29
秒钟 = 30
秒钟 = 31
秒钟 = 32
秒钟 = 33
秒钟 = 34
秒钟 = 35
秒钟 = 36

2.2 断续器中断

func main() {
ticker := time.NewTicker(1 * time.Second)
fmt.Println("======== 老狼老狼几点了? ========")
for {
t := <-ticker.C
c := t.Second()%12
if c == 0 {
ticker.Stop()
fmt.Println("老狼:12点了!!嗷~~~~~")
break
}
fmt.Printf("老狼:%d 点了~ \n",c)
}
}
  • 输出
======== 老狼老狼几点了? ========
老狼:4 点了~
老狼:5 点了~
老狼:6 点了~
老狼:7 点了~
老狼:8 点了~
老狼:9 点了~
老狼:10 点了~
老狼:11 点了~
老狼:12点了!!嗷~~~~~

posted on   运维开发玄德公  阅读(19)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示