除了异步请求,一般上我们用的比较多的应该是异步调用。通常在开发过程中,会遇到一个方法是和实际业务无关的,没有紧密性的。比如记录日志信息等业务。这个时候正常就是启一个新线程去做一些业务处理,让主线程异步的执行其他业务。
1、何为异步调用
说异步调用
前,我们说说它对应的同步调用
。通常开发过程中,一般上我们都是同步调用
,即:程序按定义的顺序依次执行的过程,每一行代码执行过程必须等待上一行代码执行完毕后才执行。而异步调用
指:程序在执行时,无需等待执行的返回值可继续执行后面的代码。显而易见,同步有依赖相关性,而异步没有,所以异步可并发
执行,可提高执行效率,在相同的时间做更多的事情。
处理
异步
、同步
外,还有一个叫回调
。其主要是解决异步方法执行结果的处理方法,比如在希望异步调用结束时返回执行结果,这个时候就可以考虑使用回调机制。
2、Async异步调用
在
SpringBoot
中使用异步调用是很简单的,只需要使用@Async
注解即可实现方法的异步调用。
注意:需要在启动类加入@EnableAsync
使异步调用@Async
注解生效。
@SpringBootApplication
@EnableAsync
@Slf4j
public class Chapter21Application {
public static void main(String[] args) {
SpringApplication.run(Chapter21Application.class, args);
log.info("Chapter21启动!");
}
}
3、@Async异步调用
使用@Async
很简单,只需要在需要异步执行的方法上加入此注解即可。这里创建一个控制层和一个服务层,进行简单示例下。
SyncService.java
@Component
public class SyncService {
@Async
public void asyncEvent() throws InterruptedException {
//休眠1s
Thread.sleep(1000);
//log.info("异步方法输出:{}!", System.currentTimeMillis());
}
public void syncEvent() throws InterruptedException {
Thread.sleep(1000);
//log.info("同步方法输出:{}!", System.currentTimeMillis());
}
}
控制层:AsyncController.java
@RestController
@Slf4j
public class AsyncController