SpringBoot异步处理@Async

.异步处理@Async

启动类加上@EnableAsync开启异步

springboot异步处理默认使用线程池SimpleAsyncTaskExecutor,该线程不复用,来一个任务创建一个线程于是可能引发OOM

平常开发一般使用ThreadPoolTaskExecutor处理流程:

1.查看核心线程池是否已满,不满就创建一条线程执行任务,否则执行第二步。

2.查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第三步。

3.查看线程池是否已满,即就是是否达到最大线程池数,不满就创建一条线程执行任务,否则就按照策略处理无法执行的任务。

 

如何等待最后一个任务执行完毕,对任务结果进行汇总处理。

方法一:使用自旋操作,等待任务结果返回。

 //自旋锁,停止等待
while (true) {
   if (future1.isDone() && future2.isDone()) {
           log.info("Task1 result:{}", future1.get());
           log.info("Task2 result:{}", future2.get());
           break;
      }
    Thread.sleep(1000);
            }
log.info("All tasks finished.");

方法二:使用CountDownLatch计数器

CountDownLatch latch = new CountDownLatch(2);
//参数是异步任务数量

每个异步任务的方法内部结束需要将计数器减1

latch.countDown();

主线程必须在启动其他线程后立即调用await()方法来阻塞主线程,直到其他线程完成各自的任务。

latch.await();

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值