根据条件定期或仅运行一次ScheduledExecutorService

时间:2015-03-19 05:37:10

标签: java concurrency timer scheduling java.util.concurrent

我有一个特定的任务,必须定期执行,或者只根据一个条件执行一次。我使用以下方法:

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的情况,即任务未取消的情况,该任务运行正常。但是,对于另一种情况(当需要执行一次时)它根本不执行。

1 个答案:

答案 0 :(得分:4)

它没有执行,因为你在有机会甚至运行一次之前取消任务 - scheduleAtFixedRate将立即返回并允许你的方法继续执行,第一件事就是它是取消尚未执行的任务。

不是安排任务然后取消它,而是将其作为非计划任务提交,例如。

ScheduledExecutorService dataTimer = Executors.newScheduledThreadPool(1);

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

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