运行 ScheduledExecutorService 根据条件定期或仅一次
Run a ScheduledExecutorService periodically or just once based on condition
我有一个特定的任务必须定期执行,或者根据条件只执行一次。我正在使用以下方法:
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
将立即 return 并允许您的方法继续执行, 它做的第一件事是取消尚未执行的任务。
与其安排任务然后取消它,不如将其作为非计划任务提交,例如
ScheduledExecutorService dataTimer = Executors.newScheduledThreadPool(1);
if(isDynamic)
{
dataTimer.scheduleAtFixedRate(r, 0L, freq, TimeUnit.MILLISECONDS);
}
else
{
dataTimer.submit(r);
}
在后一种情况下,任务将只执行一次。
我有一个特定的任务必须定期执行,或者根据条件只执行一次。我正在使用以下方法:
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
将立即 return 并允许您的方法继续执行, 它做的第一件事是取消尚未执行的任务。
与其安排任务然后取消它,不如将其作为非计划任务提交,例如
ScheduledExecutorService dataTimer = Executors.newScheduledThreadPool(1);
if(isDynamic)
{
dataTimer.scheduleAtFixedRate(r, 0L, freq, TimeUnit.MILLISECONDS);
}
else
{
dataTimer.submit(r);
}
在后一种情况下,任务将只执行一次。