0

使用轮询系统或基于事件的计时器,什么是更快和“更好的做法”?

我目前正在与一位更资深的同事讨论如何实现一些关键任务逻辑。情况如下:

  • 接收到给出执行时间的消息。
  • 当达到该执行时间时,必须执行一些逻辑。
  • 现在可以接收多个消息,给出不同的执行时间,并且每次都必须执行逻辑。

我认为实现逻辑的最佳方法是创建一个计时器,当消息在消息中时触发逻辑,但我的同事认为我最好轮询消息列表以查看是否已到执行时间。

他的论点是轮询系统更安全,因为它不太复杂,因此不太可能被程序员搞砸。我的论点是,通过以我的方式实现它,我们减少了计算负载,因此更有可能在我们真正希望它执行时执行逻辑。我应该如何实施它,为什么?


要求的信息

  • 我的逻辑唯一一次被使用几乎肯定是在负载最高的时候。
  • 要求并没有具体说明连接的可靠性,但与我交谈过的每个人都表示他们从未听说过消息被丢弃
  • 调度基于绝对系统。因此,消息将具有指定何时执行算法的执行时间。由于有时间同步,我被指示假设所有机器的时间是统一的。
  • 被执行的算法使用一些输入,这些输入最初是不稳定的,但很快就会稳定下来。通过推迟处理,我希望使用最稳定的可用信息。
4

1 回答 1

1

java.util.Timer 有效地执行了您同事的建议(说实话,最后,确实没有那么多方法可以做到这一点)。

它维护一个 TimerTasks 的集合,并等待其上的新活动,或者直到执行下一个任务的时间到来。它不会轮询集合,它“知道”下一个任务将在 N 秒内触发,并等待直到发生这种情况或其他任何事情(例如添加或删除 TimerTask)。总体而言,这比轮询要好,因为它大部分时间都在睡觉。

所以,最后,你们俩都是对的——你应该为此使用计时器,因为它基本上可以完成你的同事想做的事情。

于 2013-07-29T18:17:52.040 回答