0

我在理解 ScheduledThreadPoolExecutor 的工作原理时遇到了一点问题(我正在使用 SCA,所以不要打扰代码中的注释)。这是我的调度程序类代码的一部分:

@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());
}

这是我的任务类代码的一部分:

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 上使用取消,然后在调度程序上使用关闭方法,但我不想停止调度程序。让我稍微解释一下:在这个应用程序中,周期性任务必须在任何时候单独调度、停止和重新调度,所以我需要一种方法来在单个任务开始运行时中断它,而无需关闭整个调度程序服务。我希望你能理解我在做什么,有什么建议吗?谢谢 :)

4

1 回答 1

0

当我们取消一个周期性任务时,这个任务后续的调度会被取消,但是调度器本身会运行,可以用来调度另一个任务。

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

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

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

于 2013-03-13T02:47:41.430 回答