2015-03-19 71 views
0

我有一個特定的任務必須定期執行,或者只是基於一個條件執行一次。我使用以下方法:根據條件定期或只運行一次ScheduledExecutorService

Runnable r = new Runnable() { 

     public void run() 
     {  
      //Execute task 
     } 
    }; 
final long freq = frequencyOfTask; 
ScheduledExecutorService dataTimer = Executors.newScheduledThreadPool(1); 
ScheduledFuture<?> dataTimerHandle = dataTimer.scheduleAtFixedRate(r, 0L, freq, TimeUnit.MILLISECONDS); 
if(!isDynamic) 
{ 
    dataTimerHandle.cancel(false); //cancel the event in main thread while asking the already submitted tasks to complete. 
} 

任務運行正常的情況下isDynamicfalse,即,其中任務沒有取消。但是,對於另一種情況(當執行需要一次)它根本不執行。

+0

其他情況你在說什麼? – 2015-03-19 05:46:47

+0

另一種情況是隻需執行一次執行 – abksrv 2015-03-19 05:48:19

回答

4

它不會執行,因爲在任務有機會運行之前取消任務 - scheduleAtFixedRate將立即返回並允許您的方法繼續執行,並且它所做的第一件事是取消as-尚未執行的任務。

而不是調度任務,然後取消它,只是提交它作爲一個非計劃的任務,而不是,例如,

ScheduledExecutorService dataTimer = Executors.newScheduledThreadPool(1); 

if(isDynamic) 
{ 
    dataTimer.scheduleAtFixedRate(r, 0L, freq, TimeUnit.MILLISECONDS); 
} 
else 
{ 
    dataTimer.submit(r); 
} 

在後一種情況下,任務只執行一次。