按间隔运行 Java 线程

2022-09-02 05:12:09

我有一个线程需要每10秒执行一次。此线程包含对另一台服务器上的数据库的多个调用 (12 - 15)。此外,它还可以访问大约3个文件。因此,将有相当多的IO和网络开销。

执行上述操作的最佳策略是什么?

一种方法是使用睡眠方法和 while 循环,但那将是一个糟糕的设计。

在这种情况下,类似于 Timer 的类会有帮助吗?另外,创建几个线程(一个用于 IO,一个用于 JDBC)而不是让它们在一个线程中运行会更好吗?


答案 1

我发现 ScheduledExecutorService 是实现这一目标的绝佳方法。它可以说比 a 稍微复杂一些,但在交换中提供了更大的灵活性(例如,您可以选择使用单个线程或线程池;它采用的单位不仅仅是毫秒)。Timer

ScheduledExecutorService executor =
    Executors.newSingleThreadScheduledExecutor();

Runnable periodicTask = new Runnable() {
    public void run() {
        // Invoke method(s) to do the work
        doPeriodicWork();
    }
};

executor.scheduleAtFixedRate(periodicTask, 0, 10, TimeUnit.SECONDS);

答案 2

一种选择是创建一个 ScheduledExecutorService,然后您可以向其计划作业:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
ex.scheduleWithFixedDelay(...);

如果您决定拥有多个线程,则可以创建具有更多线程的 ScheduledExecutorService(同样,通过 Executors 类)。

就每个线程的数量和投入的内容而言,就性能而言,我想说这取决于:

  • 对于您的特定应用程序,一个线程是否可以真正“工作”,而另一个线程正在等待I / O?
  • 您的多个线程最终会“破坏同一资源”(例如,从同一dsk上不同位置的文件读取),从而减慢彼此的速度,还是它们会同时访问不同的资源?