A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小刀葛小伦 于 2019-9-12 16:29 编辑

什么是异步调用?
异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行。


如何实现异步调用?
多线程,这是很多人第一眼想到的关键词,没错,多线程就是一种实现异步调用的方式。


在非spring目项目中我们要实现异步调用的就是使用多线程方式,可以自己实现Runable接口或者集成Thread类,或者使用jdk1.5以上提供了的Executors线程池。


StrngBoot中则提供了很方便的方式执行异步调用。
按照官方示例开撸
代码入下
maven依赖:
[Java] 纯文本查看 复制代码
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
</parent>
<dependencies>
        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
</dependencies>


启动类:添加@EnableAsync注解
[Java] 纯文本查看 复制代码
@SpringBootApplication
@EnableAsync
public class Application{
 
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}


Controller
[Java] 纯文本查看 复制代码
@RequestMapping("")
@RestController
public class AsyncTaskController {
        
        @Autowired
        private AsyncTask asyncTask;
        
        @RequestMapping("")
        public String doTask() throws InterruptedException{
                long currentTimeMillis = System.currentTimeMillis();
                asyncTask.task1();
                asyncTask.task2();
                asyncTask.task3();
                long currentTimeMillis1 = System.currentTimeMillis();
                return "task任务总耗时:"+(currentTimeMillis1-currentTimeMillis)+"ms";
                
        }
}


异步任务类
[Java] 纯文本查看 复制代码
@Component
public class AsyncTask {
        
        @Async
        public void task1() throws InterruptedException{
                long currentTimeMillis = System.currentTimeMillis();
                Thread.sleep(1000);
                long currentTimeMillis1 = System.currentTimeMillis();
                System.out.println("task1任务耗时:"+(currentTimeMillis1-currentTimeMillis)+"ms");
        }
        
        @Async
        public void task2() throws InterruptedException{
                long currentTimeMillis = System.currentTimeMillis();
                Thread.sleep(2000);
                long currentTimeMillis1 = System.currentTimeMillis();
                System.out.println("task2任务耗时:"+(currentTimeMillis1-currentTimeMillis)+"ms");
        }
        @Async
        public void task3() throws InterruptedException{
                long currentTimeMillis = System.currentTimeMillis();
                Thread.sleep(3000);
                long currentTimeMillis1 = System.currentTimeMillis();
                System.out.println("task3任务耗时:"+(currentTimeMillis1-currentTimeMillis)+"ms");
        }
}



控制台:
[Java] 纯文本查看 复制代码
[/font][/color]
[color=rgb(51, 51, 51)][font=-apple-system, &quot;]task1任务耗时:1012ms
task2任务耗时:2009ms
task3任务耗时:3004ms



访问浏览器结果入下:
[Java] 纯文本查看 复制代码
task任务总耗时:19ms

异步调用成功!


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马