SpringBoot2 异步执行方法实例

1. SpringBoot 同步执行方法

学习 SpringBoot 异步执行方法 之前我们先看一个同步执行的例子。

首先是一个 Service 类:TestAsyncService.java,这里只是为了演示,就没有访问数据库和编写接口。

@Service
public class TestAsyncService {

    public String getResult() {
        System.out.println("getResult() start...");
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("getResult() end...");
        return "TestAsync";
    }
}

然后一个 Controller 类 :TestAsyncController , 调用 TestAsyncService 如下所示 。

@EnableAutoConfiguration
@RestController
public class TestAsyncController {

    @Autowired
    TestAsyncService testAsyncService;

    @RequestMapping("/testAsyncController")
    public String testAsyncController() {
        String result;
        System.out.println("testAsyncController() start...");

        result = testAsyncService.getResult();

        System.out.println("testAsyncController() end...");
        return "结果:" + result;
    }
}

重新启动工程,访问:http://localhost:8080/testAsyncController。

他会现有 3 秒 的卡顿,卡顿是因为 TestAsyncService。

然后出现结果:

四条输出语句如下所示:

SpringBoot2 异步执行方法实例_第1张图片

2. SpringBoot 异步执行方法

SpringBoot 异步执行方法原理是创建了一个新的线程去运行 service 的方法,这会导致 controller 已经执行完成,而 service 还在运行,当然 controller 获取不到 service 的执行结果。使用到的注解是 @Async 。

第一步:修改启动类,需要添加@EnableAsync 这个注解开启异步调用。

// 启动类上加上@SpringBootApplication注解,当前包下或者子包下所有的类都可以扫到
@SpringBootApplication
// @EnableAsync 开启异步调用
@EnableAsync
public class SpringbootStudy01Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootStudy01Application.class, args);
    }
}

第二步:@Async 注解修饰 TestAsyncService,如下所示。

@Service
public class TestAsyncService {

    @Async
    public String getResult() {
        System.out.println("getResult() start...");
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("getResult() end...");
        return "TestAsync";
    }
}

TestAsyncController 不需修改,重新启动工程,访问 : http://localhost:8080/testAsyncController 。

运行截图如下所示:

SpringBoot2 异步执行方法实例_第2张图片

SpringBoot2 异步执行方法实例_第3张图片

显然,controller 已经执行完成,而 service 还在运行。

你可能感兴趣的:(#,----SpringBoot2,三,后端开发,SpringBoot2学习笔记)