我正在弄清楚如果需要在一台机器上的jvm内尽可能快地调度大量(非阻塞)任务,应该使用什么定时器实现。

我研究了ScheduledThreadPoolExecutorHashedWheelTimer源(+ wheel timer一般文档),这是基本区别(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)。
    同样,您将减少记帐 Activity ,因为您将获得更少的滴答声(N 在这种情况下,取消功能不是很重要的功能

    是否有人尝试过将这些计时器用于类似 Activity ,并且在实践中看到了什么结果?
    谢谢!

    最佳答案

    HWT 。除非您需要精确到ns,否则请使用HWT。对于大多数客户端服务器应用程序而言,HWT就足够了。在许多Internet规模的应用程序中,尤其是对于超时不断变化的内存缓存而言,它是唯一的选择。我们在这里谈论的是数十亿个工作岗位。

    实际上,如果您需要该级别的精度,则需要一个具有保证的中断时间且没有GC暂停的系统。即不是Java,不是Intel ... :)

    10-08 16:05