【玩转SpringBoot】异步任务执行与其线程池配置

同步代码写起来简单,但就是怕遇到耗时操作,会影响效率和吞吐量。此时异步代码才是王者,但涉及多线程和线程池,以及异步结果的获取,写起来颇为麻烦。不过在遇到SpringBoot异步任务时,这个问题就不存在了。因为Spring家族是最替用户考虑的。结果就是,像同步一样简单,像异步一样强大。众所熟悉的同步代码先准备一些代码,为了模拟耗时操作,在其中加入线程睡眠语句。同时打印出运行这些代码的线程信息。如下图...
摘要由CSDN通过智能技术生成

同步代码写起来简单,但就是怕遇到耗时操作,会影响效率和吞吐量。

此时异步代码才是王者,但涉及多线程和线程池,以及异步结果的获取,写起来颇为麻烦。

不过在遇到SpringBoot异步任务时,这个问题就不存在了。 因为Spring家族是最替用户考虑的。

结果就是, 像同步一样简单,像异步一样强大 。


众所熟悉的同步代码


先准备一些代码,为了模拟耗时操作,在其中加入线程睡眠语句。

同时打印出运行这些代码的线程信息。 如下图01:


其中一个是没有返回值的,一个是有返回值的。

然后把它注入到另一个类里进行调用,在调用时也输出一下主线程信息。 如下图02:


下面是输出结果,如下图03:


可以看到这些代码运行在 主线程 中,所以这些代码的耗时操作会影响主线程。

首选的方案就是把耗时操作 放入另一个线程中 执行(通常称为工作线程),把主线程解放出来。


同步代码的异步化改造


由于SpringBoot已经帮我们做好了一切,只需按要求改造即可,只需两步,真的是非常简单。

第一步 ,引入启用异步任务的注解, @EnableAsync ,如下图04:


第二步 ,在原来的方法上标上 @Async 注解,如下图05:


这就好了,然后像普通方法一样调用,如下图06:


看下输出结果,如下图07:


可以看到主线程的id是1,而且瞬间执行完。 任务在另一个线程id为17的线程中执行,且等耗时操作执行完后才结束。

代码完全不变,只需加两个注解,同步立马变成异步啦。 简直爽歪歪了。

主要是因为这个方法没有返回值,如果有的话, 只需改下返回类型即可 。

SpringBoot一共支持三种返回类型,来逐一看下。

第一种 ,返回类型为Java的 Future<?> ,如下图08:


熟悉Java多线程的朋友对这个类都应该不陌生。 为了代码能正常编译,在方法最后需要return一个这样的类型。

在同步代码中,我们原来return的是一个Object类型,显然不满足需求,所以SpringBoot就想了一个办法。

新增了一个类, AsyncResult ,使用它进行类型适配,这也是此类的主要作用,保证编译通过。

这个类就像一个“类型”占位符一样,如果你真正了解Java多线程的话就会明白,否则绝对不明白。

然后就像普通方法调用一样调用它,接着通过wh
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值