同步和异步通常用来形容方法的调用方式。
同步方法表明调用一旦开始,调用者必须等待方法执行完成,才能继续执行后续方法。
异步方法表明,方法一旦开始,立即返回,调用者无需等待其中方法执行完成,就可以继续执行后续方法。
通常我们写的方法都是同步方法,方法间执行都是串行化的,在一个线程内运行。
我们举一个小例子:
你和朋友去吃饭,你们到达饭店,点了一桌满汉全席。由于你们饿的不行,就在饭店等待厨师做好菜,等菜上桌。你和你的朋友吃完饭,付了钱,舒舒服服的去商场购物了,一次饭局就结束了。这就是同步调用。
如今,我们正处在互联网时代,当你们饿的时候,就打开饿了么,点了一桌满汉全席,支付了餐费,这时你就完成了点菜。商家接到了你的订单之后,就会马上开始安排(毕竟顾客就是上帝嘛)。现在你们无须默默等待,以免被饿所折磨,于是你们打开了京东,开始了新的购物。当饿了么小哥饭菜送到时,一签单就完事了,并且你们也完成了购物。这就是异步调用。
我们使用代码表示:
public static void eatMeal() {
System.out.println("点了一桌满汉全席,快来吃啊。。。");
try {
//模拟等待上菜时间
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("饭已吃完,饭局结束。");
}
public static void shop() {
System.out.println("我们可以开始购物了。");
}
public static void main(String[] args) {
eatMeal();
shop();
}
执行结果:按着上下文顺序,依次执行。典型的同步调用方式。
![](https://i-blog.csdnimg.cn/blog_migrate/cbae7887a5f28f4c5903481962971f79.png)
现在我们修改一下eatMeal()方法,改为异步方式,通常使用线程开启异步。
另外springboot中可以使用(@EnableAsync和@Async)开启异步模式。
![](https://i-blog.csdnimg.cn/blog_migrate/6d7c9d1f4107611e73aa6ccf372c8975.png)
执行结果:使用异步方式,我们可以把耗时的操作,放在另外一个线程之中,
提高程序性能。
![](https://i-blog.csdnimg.cn/blog_migrate/b2f00f089687edd596647c9e5a3b555f.png)
这个例子不是特别的好。通常在业务需求中,当上下文内容没有关联的时候,上一个操作比较耗时,
我们无需等待上一个执行结束才开始下一个执行,我们就可以使用异步方式,提高响应速度,进而提高程序性能。