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