正文
,这些都是典型的可以通过异步实现的场景。
❞
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
-
视频教程:https://doc.iocoder.cn/video/
-
-
-
-
-
Spring ApplicationEvent事件
-
-
第三方异步框架,比如Hutool的ThreadUtil
-
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/yudao-cloud
-
视频教程:https://doc.iocoder.cn/video/
首先我们先看一个常见的用户下单的场景:
什么是异步
在同步操作中,我们执行到
「发送短信」
的时候,我们必须等待这个方法彻底执行完才能执行
「赠送积分」
这个操作,如果
「赠送积分」
这个动作执行时间较长,发送短信需要等待,这就是典型的同步场景。
实际上,发送短信和赠送积分没有任何的依赖关系,通过异步,我们可以实现
赠送积分
和
发送短信
这两个操作能够同时进行,比如:
异步
这就是所谓的异步,是不是非常简单,下面就说说异步的几种实现方式吧。
public class AsyncThread extends Thread {
@Override
public void run() {
System.out.println("Current thread name:" + Thread.currentThread().getName() + " Send email success!");
}
public static void main(String[] args) {
AsyncThread asyncThread = new AsyncThread();
asyncThread.run();
}
}
当然如果每次都创建一个
Thread
线程,频繁的创建、销毁,浪费系统资源,我们可以采用线程池:
private ExecutorService executorService = Executors.newCachedThreadPool();
public void fun() {
executorService.submit(new Runnable() {
@Override
public void run() {
log.info("执行业务逻辑...");
}
});
}
可以将业务逻辑封装到
Runnable
或
Callable
中,交由线程池来执行。
@Slf4j
public class FutureManager {
public String execute() throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(1);
Future future = executor.submit(new Callable() {
@Override
public String call() throws Exception {
System.out.println(