java定时器实现原理_Go 定时器内部实现原理剖析

本文深入探讨了系统协程如何管理一次性定时器Timer和周期性定时器Ticker,详细介绍了它们的数据结构存储方式、触发机制及如何添加和删除定时器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

前面我们介绍了一次性定时器Timer和周期性定时器Ticker,这两种定时器内部实现机制相同。创建定时器的协程并不负责计时,而是把任务交给系统协程,系统协程统一处理所有的定时器。

本节,我们重点关注系统协程是如何管理这些定器的,包括以下问题:

定时器使用什么数据结构存储?

定时器如何触发事件?

定时器如何添加进系统协程?

定时器如何从系统协程中删除?

定时器存储

timer数据结构

Timer和Ticker数据结构除名字外完全一样,二者都含有一个runtimeTimer类型的成员,这个就是系统协程所维护的对象。 runtimeTimer类型是time包的名称,在runtime包中,这个类型叫做timer。

timer数据结构如下所示:

type timer struct {

tb *timersBucket // the bucket the timer lives in // 当前定时器寄存于系统timer堆的地址

i int // heap index // 当前定时器寄存于系统timer堆的下标

when int64 // 当前定时器下次触发时间

period int64 // 当前定时器周期触发间隔(如果是Timer,间隔为0,表示不重复触发)

f func(interface{}, uintptr) // 定时器触发时执行的函数

arg interface{} // 定时器触发时执行函数传递的参数一

seq uintptr // 定时器触发时执行函数传递的参数二(该参数只在网络收发场景下使用)

}

其中timersBucket便是系统协程存储timer的地方,而i便是timer存储的下标。

timersBucket数据结构

存储拓扑

(图示,timer和timersBucket的关系)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值