6-并发编程之-定时器
一 Timer
时间到了,执行只执行1次(延迟任务)
package main
import (
"fmt"
"sync"
"time"
)
//timer 只能按时触发一次,可通过Reset()重置后继续触发。
func main() {
var wg sync.WaitGroup
timer:=time.NewTimer(1*time.Second)
wg.Add(1)
go func() {
for{
select {
case <-timer.C:
fmt.Println("定时1s,我执行了")
wg.Done()
}
}
}()
wg.Wait()
}
1.2 通过Reset重写设置定时器
package main
import (
"fmt"
"time"
)
//timer 只能按时触发一次,可通过Reset()重置后继续触发。
func main() {
timer := time.NewTimer(1 * time.Second)
go func() {
var count = 0
for {
select {
case <-timer.C:
fmt.Println("定时1s,我执行了")
}
count++
if count <= 5 {
timer.Reset(5 * time.Second)
}
}
}()
time.Sleep(10 * time.Second)
}
1.3 使用time.After() 实现定时任务
// 阻塞一下,等待主进程结束
timer := time.NewTimer(time.Second * 10)
<-timer.C // 等10s,才会有值
fmt.Println("over.")
<-time.After(time.Second * 4)
fmt.Println("再等待4秒退出。timer 没有终止,打印出 over 后会看见在继续执行...")
timer.Stop()
<-time.After(time.Second * 2)
fmt.Println("timer.Stop()后, timer 仍继续执行,只是关闭了 tt.C 通道。")
package main
import (
"fmt"
"time"
)
func main() {
<-time.After(time.Second * 4)
fmt.Println("4s后执行")
}
二 Ticker
时间到了,多次执行(定时任务)
package main
import (
"fmt"
"time"
)
func main() {
var i = 0
ticker := time.NewTicker(time.Second * 1) // 创建一个定时器对象
//开启go协程
go func() {
for {
select {
case <-ticker.C: // 每隔一秒,会执行一次
fmt.Printf("执行了第%d次\n", i)
i++
if i >= 10 {
ticker.Stop() // 停止定时器
}
}
}
}()
time.Sleep(15*time.Second)
}
作者:liuqingzheng
出处:https://www.cnblogs.com/liuqingzheng/p/15997421.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人