作者:追梦1819
原文:https://www.cnblogs.com/yanfei1819/p/11095891.html
版权声明:本文为博主原创文章,转载请附上博文链接!
## 引言
系统中的异步任务有很多优点,例如:1)I/O受限等情况下,异步能提;2)增强系统的健壮性;3)改善用户体验。
但是也有一些缺点,例如:1)如果滥用的话会影响系统的性能;2)相对于同步编程来说,增加编程的难度。
本章不对异步任务的优缺点做过多的详解,是否需要使用异步任务,要根据系统的业务来决定。本章只阐述 SpringBoot 中的异步任务。
版本信息
-
JDK:1.8
-
SpringBoot :2.1.4.RELEASE
-
maven:3.3.9
-
IDEA:2019.1.1
异步任务使用
关于异步任务的使用,结果的展示可能不是很明显。我们先创建几个常规的方法,然后再使之异步,看看两者结果的区别。
先创建一个项目,引入 web 的 maven 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
然后创建几个常用的方法:
package com.yanfei1819.asynctaskdemo.task;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
/**
* Created by 追梦1819 on 2019-06-21.
*/
@Component
public class AsyncTask {
public void task01() throws InterruptedException {
Long start = System.currentTimeMillis();
System.out.println("这是第一个异步任务!");
Thread.sleep(2000);
Long end = System.currentTimeMillis();
System.out.println("第一个任务执行时间是:"+(end-start));
}
public void task02() throws InterruptedException {
Long start = System.currentTimeMillis();
System.out.println("这是第二个异步任务!");
Thread.sleep(3000);
Long end = System.currentTimeMillis();
System.out.println("第二个任务执行时间是:"+(end-start));
}
public void task03() throws InterruptedException {
Long start = System.currentTimeMillis();
System.out.println("这是第三个异步任务!");
Thread.sleep(4000);
Long end = System.currentTimeMillis();
System.out.println("第三个任务执行时间是:"+(end-start));
}
}
下面创建一个测试类:
package com.yanfei1819.asynctaskdemo.web.controller;
import com.yanfei1819.asynctaskdemo.task.AsyncTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by 追梦1819 on 2019-06-21.
*/
@RestController
public class TaskController {
@Autowired
private AsyncTask asyncTask;
@GetMapping("/testTask")
public void testTask() throws InterruptedException {
Long start = System.currentTimeMillis();
asyncTask.task01();
asyncTask.task02();
asyncTask.task03();
Long end = System.currentTimeMillis();
System.out.println("三个任务执行总时间是:"+(end-start));
}
}
最后启动项目,访问 localhost:8080/testTask
,结果如下:
很明显这是很常规的同步方法。下面我们使用 SpringBoot 自带的异步方法实现方式作异步处理。
需要改动的地方有两处:
- 在启动类的中加注解
@EnableAsync
; - 在异步的方法上加注解
@Async
。
重启项目,访问同一个路径,以下是结果:
总结
异步任务的使用跟其他的用法一样很简单,SpringBoot 也将其集成到 Spring 生态圈中,只需要使用其中的几个注解即可。后续将分析其原理。