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

8 篇文章 0 订阅

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

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

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

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

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

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

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

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

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

setWaitForTasksToCompleteOnShutdown(true),
setAwaitTerminationSeconds(60);

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

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

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

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

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

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

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值