SpringBoot使用异步线程池使程序无法关闭

在SpringBoot项目中使用多线程时遇到程序阻塞不关闭的问题,通过设置线程池并使用CountDownLatch确保所有任务完成后再关闭线程池,避免了阻塞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

又是一个困扰我在整整一天的难题,到了快23点,终于结束了,虽然很想睡觉,但还是得把它记录下来.                                               

今天在一个springBoot程序中想使用多线程(我的程序不是web),网上的教程有很多,大多都是使用

ThreadPoolTaskExecutor配合spring的异步注释@EnableAsync和@Async,具体的实现很简单,

网上的教程大抵上都差不多,如果想要了解,可以看这个SpringBoot对多线程的支持详解.这个例子很简单,

当我使用其中的多线程的配置完成后,关于线程池的执行任务方面完全没有问题,但是这个时候出现一个问题,

你也可以自己运行上面的教程中的例子,你会发现当线程池执行完任务后,整个SpringBoot被阻塞了,

没有关闭,就卡在线程池的任务执行完那里,就我后面解决后的理解来看,是线程池没有关闭,具体的原因我并不知道,

但是我猜测是因为SpringBoot对这个线程池的支持是异步的,一般异步线程是需要Future配合通知关闭的,

然后我就开始搜索答案,百度显然不管用,国内的帖子的解决办法只有一个,就是在线程池的创建的地方加上

setWaitForTasksToCompleteOnShutdown(true),
setAwaitTerminationSeconds(60);

大致的意思看名字就可以以看的出来,就是等60秒后关闭,但是这个并没有什么乱用,然后我就遁入stackoverflow,

这里的解决方案就很多了,我试了几种,再结合自己的理解,找到了一种方法,就是在最后运行的主类中

加入一个之前配置的ThreadPoolTaskExecutor的Bean,显性的运行完线程后执行shutdown(),

有一点需要注意的是,上面的例子中的执行内容很简单,可能主线程在其他任务没有执行完成前就获得了执行的权限,

导致任务没有执行完,就关闭了线程池,这里就需要一个Java并发工具CountDownLatch,

大家可以自行了解使用,我觉得和join没什么区别,但是需要在线程池中使用,好了问题就这样了

 

### Spring Boot 应用程序中优雅关闭线程池的方法 在Spring Boot应用程序中实现线程池的优雅关闭涉及几个方面。为了确保所有正在执行的任务完成而不中断服务,应当配置`ThreadPoolTaskExecutor`并利用其生命周期管理功能。 定义自定义线程池时可以注入`@Bean`来创建一个`ThreadPoolTaskExecutor`实例[^1]: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration public class ThreadPoolConfig { @Bean(name = "customTaskExecutor") public ThreadPoolTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 配置核心和最大线程数、队列容量等参数... // 设置等待时间以便让已经启动但在shutdown时还未完成的任务能够继续运行直到结束 executor.setAwaitTerminationSeconds(60); // 当设置为true时,在调用了shutdown方法之后将会拒绝新任务提交;如果设false,则会抛出异常。 executor.setWaitForTasksToCompleteOnShutdown(true); return executor; } } ``` 通过上述方式初始化线程池后,还需要确保当应用停止时能正确触发线程池关闭逻辑。这可以通过监听上下文关闭事件(`ContextClosedEvent`)或使用`SmartLifecycle`接口中的`stop()`方法来达成目的。 对于更复杂的场景,比如异步处理或者定时调度任务,应该考虑采用`@Async`注解配合`org.springframework.scheduling.annotation.AsyncConfigurerSupport`类来自定义异步执行器,并重写其中的相关方法以提供更加精细控制的能力。 最后值得注意的是,除了编程上的措施外,合理调整JVM参数以及监控工具的应用也是保障系统稳定性的有效手段之一。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值