我想让我自定义的 java 类,在被创建后,有定时功能。每个对象在被创建后的每过一段时间引发一个事件,事件参数有类的实例,在事件内编写代码进行处理,定时引发的事件可以设置只引发一次,也可以设置多次引发事件。也可以设置终止引发事件。
比如定时时间是 8 秒,有一个类,该类有两个实例,前一个在第 1 秒时创建,后一个在第 5 秒时被创建,前一个实例会在第 9 秒,引发一个事件,后一个会在第 13 秒引发一个事件,这只是只引发一次的情况,如果是多次引发,那么前一个会在一分钟内的 9 秒,17 秒、25 秒、33 秒、41 秒、49 秒、57 秒,各引发一个事件。后一个实例会在一分钟内的 13 秒、21 秒、29 秒、37 秒、45 秒、53 秒,各引发一个事件。
实际的应用的话,比如 Session 的过期功能,每一个 session 在产生后的过期引发的事件,从 session 缓存里移除了,又比如 netty 里每一个连接的心跳超时引发的事件。
这个在思路和原理上是如何实现的?有现成框架么?
1
opengps 2020-11-24 15:01:24 +08:00
类里有私有变量定时器
构造函数里有定时器启动 |
2
xizismile 2020-11-24 15:35:02 +08:00 via Android
你想偏了,你应该在对象失效被清除之后,插一段触发事件的逻辑
aop 了解一下 |
3
gotonull 2020-11-24 15:37:19 +08:00
构造函数中起定时器
|
4
GM 2020-11-24 15:40:48 +08:00 2
你这个需求是很奇怪的,很可能不是你真实的需求。
我的感觉,你所描述的像是初学者想要达成一个目标,但是并不知道这个目标怎么做比较合理,所以能做的就是用自己当前所掌握的知识、工具来设计了看起来能达成目标的一个方案(也就是你所提出的对象创建后的定时事件),然后再去问大家怎么实现这个方案。 建议描述你的真实需求,让大家提出更好的解决方案。 |
5
1wlinesperday 2020-11-24 15:49:19 +08:00
我感觉做一个抽象,假设就叫 DelayedFunc 接口吧,让每个类型都实现这个接口。
每个类型都实现两个接口方法 分别返回一个时间戳和待调用的 Function 。 然后有个 DelayedFuncManager 统一管理这些对象就可以了。 你只需要添加实例到这 manager 就行了,manager 内部可以用堆来管理它们,感觉也比较清晰。 |
7
tctc4869 OP |
9
raiz 2020-11-24 16:36:50 +08:00
共享一个定时器,每一个实例只记录过期时间
|
10
securityCoding 2020-11-24 16:41:22 +08:00
@tctc4869 准确的延时执行,关键字搜索:时间轮
|
11
across 2020-11-24 16:42:25 +08:00
如果 [Subscribe] [Observer] 模式知道就没有困难吧。
事件有个统一管理器 Mgr,类构造函数时向其注册事件,Mgr 内部定时检查事件更新时机,到了调用下不就好了。 |
12
huifer 2020-11-24 16:44:12 +08:00
event 开发
|
13
tctc4869 OP @securityCoding 谢谢
|
14
hebin 2020-11-24 19:25:24 +08:00 via iPhone
简单的方法可以 manager 内部用时间戳来创建一个堆,一个线程不断取出最小的(也就是最近要过期的那个)取出来用注册的时间戳做判断,到了就执行,没到在放回去就可以了
|