从ThreadPoolTask​​Scheduler池中删除任务Spring

时间:2019-03-25 16:10:16

标签: java spring

我正在使用ThreadPoolTask​​Scheduler和Scheduler创建任务,但是当我设置一个新任务时,我想删除其中的一个或全部,我该怎么做?

    @Bean
public ThreadPoolTaskScheduler createThreadPoolTaskScheduler() {
    ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
    threadPoolTaskScheduler.setPoolSize(10);
    threadPoolTaskScheduler.setThreadNamePrefix(threadPrefix);
    threadPoolTaskScheduler.initialize();
    return threadPoolTaskScheduler;
}

添加任务:

private final Scheduler scheduler;
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
public void addTask(){
    FixedRateTask update = new FixedRateTask(this::executeOnRateMethod
            , initialDelay, waitTime);

    taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    scheduler.setTask(taskRegistrar.scheduleFixedRateTask(update));
}

似乎在打电话:

taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
taskRegistrar.scheduleFixedRateTask(update);

每次都将线程添加到池中,也无法取消调度程序:

scheduler.getTask().cancel();

2 个答案:

答案 0 :(得分:0)

呼叫task.cancel(...) 尝试取消任务。

如果任务已经完成,已经被取消或由于其他原因而无法取消,则此尝试将失败。

如果成功,并且在调用cancel时此任务尚未开始,则该任务永远不会运行。

如果任务正在运行,则task.cancel(true)将中断正在运行的线程。

因此,您需要正确处理FixedRateTask中的中断:

if (!Thread.currentThread().isInterrupted()) {
   ...
}

此外,您需要适当处理InterruptedException

try {
    ...
} catch (InterruptedException e) {
    // re-establish the interrupt condition
    Thread.currentThread.interrupt();
    return;
}

答案 1 :(得分:0)

当您安排将来的ScheduledFuture<?>时,将返回。ScheduledFuture<?>scheduledFuture.cancel(false),它将取消您放置在执行程序中的计划任务。