【问题标题】:Run a ScheduledExecutorService periodically or just once based on condition根据条件定期或仅运行一次 ScheduledExecutorService
【发布时间】:2015-03-19 05:37:09
【问题描述】:

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

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

【问题讨论】:

  • 你说的是其他哪种情况??
  • 另一种情况是只需要执行一次

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


【解决方案1】:

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

不要调度任务然后取消它,而是将其作为非调度任务提交,例如

ScheduledExecutorService dataTimer = Executors.newScheduledThreadPool(1);

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

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

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 2021-08-18
    • 2018-01-18
    相关资源
    最近更新 更多