我有一个服务器端应用程序,客户端可以请求重新加载配置。如果客户端请求重新加载配置,则不应立即执行此操作,但延迟时间为1分钟。如果另一个客户端也请求在同一分钟重新加载配置,则应忽略此请求。
我的想法是使用ScheduledExecutorService安排任务,如:
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.schedule(new LoadConfigurationTask(), 1, TimeUnit.MINUTES);
public class LoadConfigurationTask Runnable {
public void run() {
// LoadConfiguration
}
}
如何检查LoadConfigurationTask是否已安排但尚未执行,以便能够在重新加载配置之前忽略其他请求?
答案 0 :(得分:35)
您可以像这样简单地获得对ScheduledFuture的引用:
ScheduledFuture<?> schedFuture = service.schedule(new LoadConfigurationTask(), 1, TimeUnit.MINUTES);
现在有了未来,您可以检查任务是否完成:
schedFuture.isDone();
或者甚至更好,检查执行开始前剩余的时间:
schedFuture.getDelay(TimeUnit.MINUTES);
无需外部变量来跟踪状态。
答案 1 :(得分:3)
最简单的方法就是设置AtomicBoolean
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html
启动任务时将其设置为true,任务完成时将其设置为false,除非处于false状态,否则不再启动任务。
确保在finally块中将设置设置为false,这样您就不会在不取消设置的情况下意外退出。