「Spring Boot:2.2.1」
师傅:知道如何实现异步调用嘛?
悟纤:这个我知道,使用多线程就可以了。
师傅:继续不要停。
悟纤:就是实现Runnable接口或者继承Thread类。
师傅:在开动一下大脑还有别的没?
悟纤:师傅,我想起来了,在使用jdk1.5以上提供了的Executors线程池,所以还可以使用线程池进行实现。
师傅:孺子可教,在非Spring的项目中实现的方式说的差不多了。但是在Spring项目中,可是有更简单的使用方式哦。
一、什么是异步调用
异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行。
二、如何实现异步调用?
多线程,这是很多人能想到的关键词,没错,多线程就是一种实现异步调用的方式。
在非spring目项目中我们要实现异步调用的就是使用多线程方式,可以自己实现Runable接口或者集成Thread类,或者使用jdk1.5以上提供了的Executors线程池。
在Spring 3.0之后就有了更简单的方式一个,一个注解@Async,轻松搞定,妈妈再也不用担心我为异步任务烦恼了。
三、@Async如何使用
@Async如何进行使用呢,只需要两步:
(1)启用异步任务:在启动类上添加@EnableAsync注解,启用异步任务,该注解主要是为了扫描范围包下的@Async的注解。
(2)异步任务注解:在需要异步执行的方法上添加@Async注解,此方法即是异步执行的。
3.1 启用异步任务
在启动类上添加@EnableAsync注解:
@SpringBootApplication
@EnableAsync //启用异步任务
public class SpringBootAsyncApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootAsyncApplication.class, args);
}
}
3.2 异步任务注解
在需要异步的方法添加@Async注解:
@Async
public void task1() throws InterruptedException {
long startTime = System.currentTimeMillis();
TimeUnit.SECONDS.sleep(1);
long endTime= System.currentTimeMillis();
System.out.println("task1耗时:"+(endTime-startTime) );
}
@Async
public void task2() throws InterruptedException {
long startTime = System.currentTimeMillis();
TimeUnit.SECONDS.sleep(2);
long endTime= System.currentTimeMillis();
System.out.println("task2耗时:"+(endTime-startTime) );
}
异步方法的调用,原先怎么调用方法还是怎么就可以。
asyncTask.task1();
asyncTask.task2();
四、悟纤小结
悟纤:师傅,你累了,我来进行个小结吧。
(1)异步任务的实现方式:多线程、线程池、异步注解。
(2)多线程:多线程的实现就是实现Runnable接口和继承Thread类。
(3)线程池:使用Executors构建ExecutorService,使用ExecutorService的execute执行线程。
(4)异步注解:在Spring 3.0+的框架中可以使用@Async注解方法,实现异步任务。
悟纤:师傅,那有没有办法知道什么时候执行完毕和执行的结果呢 ?
师傅:这个是必须的,下节分享在揭晓。
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。