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 2022-05-09 09:46  运维开发玄德公  阅读(16)  评论(0编辑  收藏  举报  来源

导航