我正在使用ThreadPoolTaskScheduler和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();
答案 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)
,它将取消您放置在执行程序中的计划任务。