4

我需要对 Java 代码进行一些定期检查。有些事情在单独的线程中执行,我需要每 5 秒检查一次,然后每 10 分钟检查一次,等等。

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

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

4

5 回答 5

6

您应该使用ScheduledThreadPoolExecutorclass,它正是这样做的。

于 2012-11-19T15:53:55.590 回答
4

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

根据javadoc

一个 ThreadPoolExecutor,可以额外安排命令在给定延迟后运行,或定期执行。当需要多个工作线程时,或者需要额外的灵活性或 ThreadPoolExecutor(此类扩展)的功能时,此类比 Timer 更可取

于 2012-11-19T15:54:09.047 回答
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);
于 2012-11-19T15:56:03.850 回答
1

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

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

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

忽略其他人所说的具体方法,正确的时间方法取决于您要做什么。无论您想要短间隔还是长间隔,您是否需要非常精确的计时,或者您是否可以接受稍晚和/或提前的事件,您是否需要关心节省电池/CPU,您是否需要固定的开始间隔或固定的结束 - to-start 间隔,任务是否快速完成或者是否需要一些时间才能完成,是否要允许另一个任务在前一个任务开始之前启动,是否需要持久性(即是否希望能够继续系统重新启动或进程终止后的计时器)。所有这些都会影响使用的最佳计时器。

于 2012-11-19T16:14:53.977 回答
1

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

于 2012-11-19T18:15:46.023 回答