Java - ScheduledExecutorService:终止时执行任务

时间:2015-05-07 12:32:10

标签: java executorservice autocloseable

我使用ScheduledExecutorService以固定费率执行任务。以下是我的主要方法的内容:

RemoteSync updater = new RemoteSync(config);
try  {
    updater.initialise();
    updater.startService(totalTime, TimeUnit.MINUTES);
} catch (Exception e) {
    e.printStackTrace();
}

RemoteSync实现AutoCloseable(和Runnable)接口,因此我最初使用try-with-resources,如下所示:

try (RemoteSync updater = new RemoteSync(config)) {
    ...
} catch (Exception e) {
   e.printStackTrace();
}

updater.startService()在安排任务后立即返回,因此过早调用updater.close()并退出应用程序。

以下是startService()的{​​{1}}方法:

RemoteSync

理想情况下,我希望有一个方法:

public void startService(int rate, TimeUnit unit) {
    ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
    service =
        scheduledExecutorService.scheduleWithFixedDelay(this, 1L,
        rate,
        unit);
}

这将允许我在调度程序实际停止时调用scheduledExecutorService.executeAtTermination(Runnable task) ,不幸的是我不知道这样的方法。

我可以做的是阻止close()方法,类似这样:

startService()

但这感觉很脏,而且非常黑客。

欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

也许你可以使用应用程序关闭钩子。就像this讨论一样。

您可以在应用程序初始化的某个阶段添加这样的代码:

Runtime.getRuntime().addShutdownHook(new Thread() {
  public void run() {
    >>> shutdown your service here <<<
  }
});

答案 1 :(得分:0)

您可以在单独的帖子中尝试scheduledExecutorService.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS),