在Java中实现“定时器”的正确方法?

时间:2012-11-19 15:53:05

标签: java timer

我需要在Java代码中进行一些定期检查。有些东西是在不同的线程中执行的,我需要每隔5秒检查一次,然后每10分钟检查一次,等等。

我应该如何在Java中实现这些“计时器”?我应该循环然后发送线程睡眠一段时间吗?

这样做的正确方法是什么?

5 个答案:

答案 0 :(得分:6)

您应该使用ScheduledThreadPoolExecutor class,这正是如此。

答案 1 :(得分:4)

您可能需要考虑使用ExecutorService实现ScheduledThreadPoolExecutorService

根据javadoc

  

一个ThreadPoolExecutor,可以另外安排运行命令   在给定的延迟之后,或定期执行。这堂课是   当需要多个工作线程时,或者何时,优先于Timer   ThreadPoolExecutor的额外灵活性或功能   (这个类扩展)是必需的

答案 2 :(得分:2)

有很多方法可以做到这一点,我会使用ScheduledExecutorService

ScheduledExecutorService scheduler = ...

final ScheduledFuture<?> fiveSecHandle =
   scheduler.scheduleAtFixedRate(task5, 5, 5, SECONDS);
final ScheduledFuture<?> beeperHandle =
   scheduler.scheduleAtFixedRate(task10, 10, 10, SECONDS);

 scheduler.schedule(new Runnable() {
   public void run() { beeperHandle.cancel(true); }
 }, 60 * 60, SECONDS);

答案 3 :(得分:1)

定时器通常由GUI框架提供,因为大多数GUI框架要求所有绘图命令和GUI修改仅在主线程上发布。具有类似要求的其他类似框架(即,仅在某些条件下要完成的某些任务)也将提供与框架施加的限制兼容的计时器实现。使用您需要尽可能兼容的框架提供的计时器。

否则,如果你想自己实现它,至少有两种常用的方法来实现定时器,一种是使用睡眠直到下一个事件的线程,另一种是在GUI框架中更常见的是使用事件循环。另一种常见的方法是,对于间隔精度不是很重要的长时间运行的任务,使用cron(Unix和类Unix系统)或Scheduled Tasks(Windows)或Alarm Intents(Android)。

  

这样做的正确方法是什么?

忽略别人对特定方式所说的话,正确的时间取决于你想要做什么。无论您需要短时间还是长时间间隔,是否需要非常精确的计时,或者如果您对稍晚和/或早期事件都很好,是否需要关心节省电池/ CPU,是否需要固定的启动间隔或固定结束 - 启动间隔,任务是否快速完成或者是否可能需要一些时间才能完成,是否要允许其他任务在前一个任务启动之前启动,是否需要持久性(即您是否希望能够继续执行系统重启或进程终止后的计时器)。所有这些都会影响最好的Timer使用。

答案 4 :(得分:1)

如果您的应用程序很大并且您也在使用负载平衡服务器,则可以尝试使用Quartz调度程序进行时间管理活动。

相关问题