Golang并发编程之timer计时器

golang并发编程之timer计时器


timer可以实现一些定时操作,内部也是通过channel实现的

package main

import (
	"fmt"
	"time"
)

func main() {
	// 定义一个timer
	timer1 := time.NewTimer(time.Second * 2)
	fmt.Printf("timer: %v\n", time.Now())
	t1 := <-timer1.C //阻塞直到时间到了
	fmt.Printf("t1: %v\n", t1)

	// 用sleep进行阻塞操作
	timer2 := time.NewTimer(time.Second * 2)
	<-timer2.C
	fmt.Println("两秒后")
	time.Sleep(time.Second * 2)
	fmt.Println("再一次两秒后")

	//使用time.After()进行阻塞操作
	<-time.After(time.Second * 2)
	fmt.Println("再再2s后")

	//让其他线程的timer停下,主线程并不会停
	timer3 := time.NewTimer(time.Second * 2)
	go func() {
		<-timer3.C
		fmt.Println("func")
	}()
	s := timer3.Stop()
	if s {
		fmt.Println("stop...")
	}
	time.Sleep(time.Second * 3)
	fmt.Println("main...")

	// 使用Reset重新设置timer时间
	fmt.Println("berofe")
	timer4 := time.NewTimer(time.Second * 5) //原来设置5s
	timer4.Reset(time.Second * 1)            //重新设置时间,即修改NewTimer的时间
	<-timer4.C
	fmt.Println("after")

}

timer.C 定义

type Timer struct {
	C <-chan Time   // 通道类型
	r runtimeTimer
}

你可能感兴趣的:(golang,后端,开发语言)