Java ThreadPoolTaskExecutor正常关闭

Java ThreadPoolTaskExecutor正常关闭,java,spring,multithreading,interrupt,executor,Java,Spring,Multithreading,Interrupt,Executor,我正在使用Spring(v4)ThreadPoolTaskExecutor执行一些连续的可运行任务。当应用程序关闭时,我希望执行器正常关闭,以便任务在继续关闭之前有时间完成迭代。如果活动任务在执行器等待时间到期之前完成其迭代(例如,ThreadPoolTaskExecutor.setAwaitTerminationSeconds()),我不希望它启动另一个迭代。到目前为止,我还没能做到这一点。我有以下执行器配置: ThreadPoolTaskExecutor executor = new Thr

我正在使用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
,但它们将继续工作(除非它们处于睡眠状态,或者将引发中断异常),并且缓存队列中的任务将不会执行。您可以只检查此状态,而不开始下一次迭代

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

您的
run
方法是一个无止境的循环,因此您不需要

executor.setWaitForTasksToCompleteOnShutdown(true);     
executor.setAwaitTerminationSeconds(30);
删除上述代码后,当您关闭线程池时,您的工作线程将立即标记为
iterrupted
,但它们将继续工作(除非它们处于睡眠状态,或者将引发中断异常),并且缓存队列中的任务将不会执行。您可以只检查此状态,而不开始下一次迭代

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