[英]ScheduledExecutorService - Check if scheduled task has already been completed
我有一個服務器端應用程序,客戶端可以請求重新加載配置。 如果客戶端請求重新加載配置,則不應立即執行此操作,但延遲時間為1分鍾。 如果另一個客戶端也請求在同一分鍾重新加載配置,則應忽略此請求。
我的想法是使用ScheduledExecutorService安排任務,如:
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.schedule(new LoadConfigurationTask(), 1, TimeUnit.MINUTES);
public class LoadConfigurationTask Runnable {
public void run() {
// LoadConfiguration
}
}
如何檢查LoadConfigurationTask是否已被調度但尚未執行,以便能夠忽略進一步的請求,直到重新加載配置為止?
您可以像這樣簡單地獲得對ScheduledFuture的引用:
ScheduledFuture<?> schedFuture = service.schedule(new LoadConfigurationTask(), 1, TimeUnit.MINUTES);
現在有了未來,您可以檢查任務是否完成:
schedFuture.isDone();
或者甚至更好,檢查執行開始前還剩多少時間:
schedFuture.getDelay(TimeUnit.MINUTES);
不需要外部變量來跟蹤狀態。
最簡單的方法就是設置AtomicBoolean
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html
在啟動任務時將其設置為true,在任務完成時將其設置為false,除非處於false狀態,否則不再啟動任務。
確保在finally塊中將設置設置為false,這樣您就不會在不取消設置的情況下意外退出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.