我有一个特定的任务,必须定期执行,或者只根据一个条件执行一次。我使用以下方法:
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.
}
对于isDynamic
为false
的情况,即任务未取消的情况,该任务运行正常。但是,对于另一种情况(当需要执行一次时)它根本不执行。
答案 0 :(得分:4)
它没有执行,因为你在有机会甚至运行一次之前取消任务 - scheduleAtFixedRate
将立即返回并允许你的方法继续执行,第一件事就是它是取消尚未执行的任务。
不是安排任务然后取消它,而是将其作为非计划任务提交,例如。
ScheduledExecutorService dataTimer = Executors.newScheduledThreadPool(1);
if(isDynamic)
{
dataTimer.scheduleAtFixedRate(r, 0L, freq, TimeUnit.MILLISECONDS);
}
else
{
dataTimer.submit(r);
}
在后一种情况下,任务只执行一次。