1. 程式人生 > 其它 >golang中的定時器

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 結束了...")

}