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点了!!嗷~~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄德公笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值