GO语言提前取消定时器

当需要提前取消定时任务的时候,不能直接关闭定时器。

例:

package main

import (
	"fmt"
	"time"
)

func run(t *time.Timer) {
	<-t.C
	fmt.Println("Timer has expired.")
}

func main() {
	t := time.NewTimer(3 * time.Second)

	fmt.Println("Timer start.")

	go run(t)

	//t.Stop() // 停止定时器会导致定时任务无法触发
	t.Reset(0) // 重置定时器时间为0 立即触发定时任务
	time.Sleep(10 * time.Second)
	fmt.Println("main exit.")
}

原因:
Golang的Timer实际的实现的方式是以一个小顶堆来维护的Timer集合并循环检查,当到时间后会弹出到Timer的管道(channel)中。

如果这个时候使用 timer.Stop() 会导致管道关闭而定时器申请的管道(channel)并未关闭。这样会导致定 run 方法一直阻塞再 <- t.c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值