ThreadPoolTask​​Executor正常关闭

时间:2018-01-30 15:25:39

标签: java spring multithreading interrupt executor

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

我假设我需要在执行程序关闭时在我的线程中设置一个标志,以便循环中断。还有其他推荐方法吗?

1 个答案:

答案 0 :(得分:2)

您的run方法无限循环,因此您无需

executor.setWaitForTasksToCompleteOnShutdown(true);     
executor.setAwaitTerminationSeconds(30);

删除上面的代码后,当您关闭线程池时,您的工作线程将立即标记为iterrupted,但它们将继续工作(除非它们正在休眠,否则将抛出InterruptionException)和任务在缓存队列中将不会执行。您可以检查此状态,不要开始下一次迭代。

myExecutor.execute(() -> {
    while(true && !Thread.currentThread().isInterrupted()) {
        doSomething();
    }
});