繁体   English   中英

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM