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)
}


posted @ 2022-03-12 15:47  刘清政  阅读(69)  评论(0编辑  收藏  举报