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

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的情况,即任务未取消的情况,任务运行良好。但是,在另一种情况下(只需要执行一次),它根本不会执行。

最佳答案

它不会执行,因为您在任务有机会运行一次之前就取消了它-scheduleAtFixedRate将立即返回并允许您的方法继续执行,而它要做的第一件事就是取消当前的-未执行的任务。

无需安排任务然后取消任务,只需将其提交为非计划任务即可,例如

ScheduledExecutorService dataTimer = Executors.newScheduledThreadPool(1);

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


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

10-05 17:49