2015-03-19 30 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); 
} 

在后一种情况下,任务只执行一次。