ThreadPoolTaskExecutor 优雅关闭
ThreadPoolTaskExecutor graceful shutdown
我正在使用 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();
}
});
我假设我需要在执行程序关闭时在我的线程中设置一个标志,以便循环中断。还有其他推荐的方法吗?
你的run
方法是一个无限循环,所以你不需要
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(30);
删除上面的代码后,当你关闭线程池时,你的工作线程会立即被标记为iterrupted
,但它们会继续工作(除非它们正在休眠,否则会抛出 InterruptionException),并且缓存队列中的任务不会被执行。你可以只检查这个状态,不要开始下一次迭代。
myExecutor.execute(() -> {
while(true && !Thread.currentThread().isInterrupted()) {
doSomething();
}
});
我正在使用 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();
}
});
我假设我需要在执行程序关闭时在我的线程中设置一个标志,以便循环中断。还有其他推荐的方法吗?
你的run
方法是一个无限循环,所以你不需要
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(30);
删除上面的代码后,当你关闭线程池时,你的工作线程会立即被标记为iterrupted
,但它们会继续工作(除非它们正在休眠,否则会抛出 InterruptionException),并且缓存队列中的任务不会被执行。你可以只检查这个状态,不要开始下一次迭代。
myExecutor.execute(() -> {
while(true && !Thread.currentThread().isInterrupted()) {
doSomething();
}
});