Springboot中,异步线程的执行顺序的控制

1、顺序的定义

异步任务存在如下几种顺序:顺序的开启子任务(运行顺序和结束顺序不确定)。顺序的完成(就是A先启动,先执行完,再执行B任务,往往A、B之间存在某种依赖关系)。还有就是优先级的排序,就是A,B,C任务都在排队,来了个优先级更高的D任务,那么就在存在资源的时候,优先执行D任务。

2、异步的定义

笔者认为:异步最重要的就是主线程的运行进程不会因为子线程有没有做完而阻塞。简单的例子就是妈妈让孩子去米,妈妈发出买米这个命令之后就应该去做其他的了。而不应该等米下锅,妈妈在那里干等着。

映射到Springboot中,最主要的应该就是接口调用之后,不管异步任务是否完成,都应该返回结果给前端。

3、实现策略的尝试

3.1、把异步作为一般方法放到同一个异步方法中

针对:顺序的完成(就是A先启动,先执行完,再执行B任务,往往A、B之间存在某种依赖关系)。

这个实现非常简单,只需要调用一个异步任务,其他的调用顺序交给子任务就好。

例如让孩子去买米。妈妈只需要发出这个买米的信号。至于先去超市,再买米,再把米拿回来这三个任务就交给孩子控制就好。体现在代码里面就是在异步任务里面普通的方法调用。

3.2、使用线程池,定义优先级

针对:优先级的排序,就是A,B,C任务都在排队,来了个优先级更高的D任务,那么就在存在资源的时候,优先执行D任务。

这里可以才用线程池是实现,而不是注解。可以参考下面的链接。为ThreadPoolTaskExecutor使用PriorityBlockingQueue

https://blog.csdn.net/qq_38397501/article/details/125280650

4、针对Future的思考

实现链接请查考:https://javaforall.cn/157831.html

Future也是@Async返回值的一种,而且通过返回值我们可以判断该任务是否已经结束。如果我们有异步执行的任务A,B,C,我们可以通判断A任务是否执行完再执行B。这样也完成了顺序的控制。

问题是在哪里去判断呢? 如果在主线程中去判断,那么是不是就做成了等米下锅的事实。就是主任务需要等待异步任务是否完成,才能决定是否进行下一步。

那么我们能不能开个异步任务来执行这A,B,C三个任务呢,技术上是可行的。但是如果开了异步任务,考虑是否需要再使用Future,保证顺序,使用同步任务更好,那就作成3.1的做法。而且在异步任务里面再开线程或者异步任务,本身就是非常不可取的做法。因为会导致线程指数级增加,一旦并发过高,性能将快速下降。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值