SpringBoot(48) —— 异步任务

1.异步任务/多线程

  • 为什么需要异步任务?或者说为什么我们需要多线程?为了提高用户体验

  • 就用邮件发送来举例,邮件发送需要时间,如果从邮件发送到完成之间的时间,我们都让用户等待,前端页面白屏/转圈提示加载中的话,结果就是用户体验及其不好
    SpringBoot(48) —— 异步任务
    SpringBoot(48) —— 异步任务

  • 解决办法就是使用异步任务/多线程,即用户点击发送之后,我们的主线程开启子线程,然后主线程直接向用户返回发送成功的提示信息,用户就结束了页面的使用,让子线程去做完耗时的邮件发送操作;这样做的好处就是用户直接就能得到发送的结果,提高了用户的体验(和用户体验相关的都是大事)

  • 但是,要使用多线程的地方,我们都需要自己去手动的编写它,即在controller中手动的开启一个新的子线程,然后在其内部调用发送邮件的任务;但其实每次需要编写开启新线程的代码大体上是不变的,就是开启一个新的线程,然后将要执行的任务交给它,主线程继续向下执行;springBoot为我们想到了简化开发的做法:使用在需要开启新线程执行的方法上使用注解@Async,并且在springBoot的启动程序上使用注解@EnableAsync

  • 使用传统多线程实现
    SpringBoot(48) —— 异步任务
    SpringBoot(48) —— 异步任务
    SpringBoot(48) —— 异步任务
    SpringBoot(48) —— 异步任务

  • 使用springBoot提供的多线程注解@Async实现
    SpringBoot(48) —— 异步任务
    SpringBoot(48) —— 异步任务
    SpringBoot(48) —— 异步任务
    SpringBoot(48) —— 异步任务
    SpringBoot(48) —— 异步任务

  • 相比较而言,使用springBoot的注解实现异步任务/多线程,只是加了一个注解,没有改变原来的service层的结构,而使用传统的多线程实现,我们需要service层实现接口runnable/Thread,并实现run(),相比之下,我们应该更愿意选择使用springBoot的注解实现异步任务/多线程

  • 相比没有开启多线程的时候,整个流程中要实现的功能是没有变的,就是调用service层发送邮件,但是用户的体验有了很大的改观,开启线程之前我们需要用户等待服务器的响应,开启多线程之后用户操作完点击发送服务器立马返回结果,用户就不用等待服务器响应时间,而真正的耗时的发送邮件的任务还是要被执行;相比之下,开启了异步任务/多线程的时候,用户体验好得多(和用户体验挂钩的都是整个项目中的大事)