如果您需要在一台机器上的 jvm 内尽可能快地安排大量(非阻塞)任务,我正在考虑使用什么计时器实现。
我已经研究ScheduledThreadPoolExecutor
和HashedWheelTimer
来源(+wheel timer general docs),这是基本的区别(N - 到目前为止所有未完成的计划任务的数量,C - 轮子大小):
ScheduledThreadPoolExecutor
- O(log N) 添加新任务
- 每个计时器滴答声 O(1)(但每个任务滴答声,所以总共 N)
- O(log N) 取消任务
- 每个滴答/任务锁定
HashedWheelTimer
- O(1) 添加新任务
- 每个计时器滴答声 O(m)(m ~ N/C,其中 C > 512 大约),所以 ~C 整体滴答声
- O(m) 取消任务
- 锁定每个任务桶(在每个刻度上)
因此,我倾向于将 HW Timer 用于此类用例,因为您必须以最小的开销快速安排任务,即 O(1) 用于新任务。您还将最小化簿记活动,因为您将获得更少的滴答数(N < C)和更少的锁定争用。在这种情况下,取消不是很重要的功能
有没有人为类似的活动尝试过这些计时器?在实践中看到了什么结果?谢谢!