我使用Spring(v4)ThreadPoolTaskExecutor
来执行一些连续的可运行任务。当应用程序关闭时,我希望正常关闭执行程序,以便任务有一些时间来完成迭代,然后再继续关闭。如果活动任务在执行程序等待时间到期之前完成其迭代(例如ThreadPoolTaskExecutor.setAwaitTerminationSeconds()
),我不希望它开始另一次迭代。到目前为止,我还没有完成这个任务。我有以下执行程序配置:
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(30);
我的任务基本上是这样设置的:
myExecutor.execute(() -> {
while(true) {
doSomething();
}
});
我假设我需要在执行程序关闭时在我的线程中设置一个标志,以便循环中断。还有其他推荐方法吗?
答案 0 :(得分:2)
您的run
方法无限循环,因此您无需
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(30);
删除上面的代码后,当您关闭线程池时,您的工作线程将立即标记为iterrupted
,但它们将继续工作(除非它们正在休眠,否则将抛出InterruptionException)和任务在缓存队列中将不会执行。您可以检查此状态,不要开始下一次迭代。
myExecutor.execute(() -> {
while(true && !Thread.currentThread().isInterrupted()) {
doSomething();
}
});