我使用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()
但这感觉很脏,而且非常黑客。
欢迎任何建议。
答案 0 :(得分:1)
也许你可以使用应用程序关闭钩子。就像this讨论一样。
您可以在应用程序初始化的某个阶段添加这样的代码:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
>>> shutdown your service here <<<
}
});
答案 1 :(得分:0)
您可以在单独的帖子中尝试scheduledExecutorService.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS),