ThreadPoolTask​​Executor 优雅关闭

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