golang中的定时器

1.  timer 定时器,时间到了执行,只执行一次

package main

import (
	"fmt"
	"time"
)

func main() {
	// 1. timer基本使用
	/*
	timer1 := time.NewTimer(2 * time.Second)
	t := time.Now()
	fmt.Printf("t = %v\n", t)
	t2 := <-timer1.C
	fmt.Printf("t2 = %v\n", t2)
	 */

	// 2. 验证timer只能响应一次
	/*
	timer2 := time.NewTimer(time.Second)
	for {
		<-timer2.C  // 第一次打印时间到,第二次就会死锁(原因:timer2定时器只往通道中发送一次Time数据)
		fmt.Println("时间到")
	}
	 */

	// 3. timer实现延时的功能
	/*
	fmt.Println("开始了", time.Now())
	time.Sleep(time.Second)
	fmt.Println("第一次延时:", time.Now())
	timer3 := time.NewTimer(2 * time.Second)
	<-timer3.C
	fmt.Println("第二次延时:", time.Now())
	<-time.After(3 * time.Second)  // time.After() 就是对 NewTimer(d).C 的封装
	fmt.Println("第三次延时:", time.Now())
	 */

	// 4. 停止定时器
	/*
	timer4 := time.NewTimer(2 * time.Second)
	go func() {
		<-timer4.C
		fmt.Println("定时器执行了")
	}()
	//time.Sleep(3 * time.Second)
	// 注意:如果定时器执行了,然后在调用timer4.Stop()就会返回false,如果没有执行就调用Stop()就会返回true
	// 定时器一旦被关闭,从定时器通道中读取数据和后面的代码将不会在执行
	b := timer4.Stop()
	if b {
		fmt.Println("timer4已经关闭")
	}
	for {

	}
	 */

	// 5. 重置定时器
	fmt.Println(time.Now())
	timer6 := time.NewTimer(3 * time.Second)
	timer6.Reset(time.Second)
	fmt.Println(<-timer6.C)

}

  

2. Ticker:时间到了,多次执行

  
package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

func main() {
	// 2. ticker 定时器,时间到了多次执行
	ticker := time.NewTicker(1 * time.Second)
	wg.Add(1)
	go func() {
		i := 1
		for {
			fmt.Println(<-ticker.C)
			if i == 5 {
				ticker.Stop()
				break
			}
			i++
		}
		wg.Done()
		fmt.Println("子 goroutine结束了")
	}()

	wg.Wait()
	fmt.Println("主 goroutine 结束了...")

}

  

posted @ 2021-11-08 11:07  专职  阅读(428)  评论(0编辑  收藏  举报