4-Go定时器

一、定时器简介

  • 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 // chan 类型
	fmt.Println("现下时间:", nowTime)
}

三、三种定时方法

package main

import (
	"fmt"
	"time"
)

func main() {
	// 1 . sleep
	time.Sleep(time.Second)

	// 2. Timer.C
	myTimer := time.NewTimer(time.Second * 2) // 创建定时器, 指定定时时长
	nowTime := <-myTimer.C                    // 定时满,系统自动写入系统时间
	fmt.Println("现下时间:", nowTime)

	// 3 time.After
	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)             // 重置定时时长为 1
	go func() {
		for {
			<-myTimer.C
			fmt.Println("子go程,定时完毕")
		}
	}()

	//myTimer.Stop()		// 设置定时器停止
	for {

	}
}

五、周期定时器

  • Ticker原型
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) // 创建一个判断是否 终止的channel

	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 // 解除 主go程阻塞
				break        // return // runtime.Goexit
			}
		}
	}()

	<-quit // 子go程 循环获取 <-myTicker.C 期间,一直阻塞
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无休止符

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

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

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

打赏作者

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

抵扣说明:

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

余额充值