使用ScheduledThreadPoolExecutor时中断和重新启动任务

时间:2013-03-13 02:15:39

标签: java scheduled-tasks scheduler interrupt futuretask

我在理解ScheduledThreadPoolExecutor如何工作方面遇到了一些问题(我正在使用SCA,所以不要费心去处理代码中的注释)。这是我的Scheduler类代码的一部分:

@AllowsPassByReference
public ScheduledFuture<?> schedule(Task task)
{
    future=scheduler.scheduleAtFixedRate(task.getRunnableContent(), task.getDelay(), task.getPeriod(), TimeUnit.MILLISECONDS);
    return future;
}

@AllowsPassByReference
public void deschedule(Task task)
{
    scheduler.remove(task.getRunnableContent());
}

这是我的Task类代码的一部分:

public void scheduleTask()
{
    if(!running)
    {
        future=scheduler.schedule(this);
        running=true;
    }
}

public void descheduleTask()
{
    if(running)
    {
        future.cancel(mayInterruptIfRunning);
        scheduler.deschedule(this);
        running=false;
    }
}

现在这是重要的事情!我看到的所有人都使用了ScheduledFutures上的cancel,然后在调度程序上使用了shutdown方法,但我不想停止调度程序。让我解释一下:在这个应用程序中,必须随时单独调度,停止和重新安排定期任务,因此我需要一种方法在一个任务开始运行时中断它而不关闭整个调度程序服务。我希望你能理解我想做什么,有什么建议吗?谢谢:))

1 个答案:

答案 0 :(得分:0)

当我们取消定期任务时,此任务后续调度将被取消,但调度程序本身将运行并可用于安排其他任务。

如果我们在任务运行时调用Future.cancel,那么

a)Future.cancel(false)不会影响正在运行的任务

b)Future.cancel(true)将在任务的线程上调用Threed.interrupt,但运行任务是否会停止取决于任务实现。例如,任务可能捕获InterruptedException(如果有)并继续工作。