标签:异步 springBoot System long currentTimeMillis currentTimeMillis1 Async public
我们在使用多线程的时候,往往需要创建Thread类,或者实现Runnable接口,如果要使用到线程池,我们还需要创建Exectors。而在Spring中只要@EnableAsync就可以开启多线程,使用@Async就可以定义一个线程任务。
1、什么是异步调用
异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行。
2、如何实现异步调用
多线程,这是很多人第一眼想到的关键词,没错,多线程就是一种实现异步调用的方式。
在非spring目项目中我们要实现异步调用的就是使用多线程方式,可以自己实现Runable接口或者集成Thread类,或者使用jdk1.5以上提供了的Executors线程池。
3、springBoot异步执行方法@Async
首先创建一个普通的SpringBoot Web工程,添加web依赖即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
开启异步,@EnableAsync 注解主要是为了扫描范围包下的所有 @Async注解
@EnableAsync
@SpringBootApplication
public class EhCacheStudyApplication {
public static void main(String[] args) {
SpringApplication.run(EhCacheStudyApplication.class, args);
}
}
创建异步任务,异步任务类代码:
@Component
public class MyAsyncTask {
@Async
public void task1() throws InterruptedException {
long currentTimeMillis = System.currentTimeMillis();
Thread.sleep(1000);
long currentTimeMillis1 = System.currentTimeMillis();
System.out.println("task1任务耗时:" + (currentTimeMillis1 - currentTimeMillis));
}
@Async
public void task2() throws InterruptedException {
long currentTimeMillis = System.currentTimeMillis();
Thread.sleep(2000);
long currentTimeMillis1 = System.currentTimeMillis();
System.out.println("task2任务耗时:" + (currentTimeMillis1 - currentTimeMillis));
}
@Async
public void task3() throws InterruptedException {
long currentTimeMillis = System.currentTimeMillis();
Thread.sleep(1000);
long currentTimeMillis1 = System.currentTimeMillis();
System.out.println("task3任务耗时:" + (currentTimeMillis1 - currentTimeMillis));
}
}
@RestController
public class AsyncTaskController {
@Autowired
private MyAsyncTask myAsyncTask;
@RequestMapping
public String doTask() throws InterruptedException {
long currentTimeMillis = System.currentTimeMillis();
myAsyncTask.task1();
myAsyncTask.task2();
myAsyncTask.task3();
long currentTimeMillis1 = System.currentTimeMillis();
System.out.println("task任务总耗时:" + (currentTimeMillis1 -currentTimeMillis));
return "task任务总耗时:" + (currentTimeMillis1 -currentTimeMillis);
}
}
启动项目,访问接口,查看后台输出结果:
4、采用Future来查看异步任务执行完毕和执行的结果
创建异步执行任务,异步代码块:
@Component
public class FutureAsyncTask {
@Async
public Future<String> task1() throws InterruptedException {
long currentTimeMillis = System.currentTimeMillis();
Thread.sleep(1000);
long currentTimeMillis1 = System.currentTimeMillis();
System.out.println("task1任务耗时:" + (currentTimeMillis1 - currentTimeMillis));
return new AsyncResult<>("task1执行完毕!");
}
@Async
public Future<String> task2() throws InterruptedException {
long currentTimeMillis = System.currentTimeMillis();
Thread.sleep(2000);
long currentTimeMillis1 = System.currentTimeMillis();
System.out.println("task2任务耗时:" + (currentTimeMillis1 - currentTimeMillis));
return new AsyncResult<>("task2执行完毕!");
}
@Async
public Future<String> task3() throws InterruptedException {
long currentTimeMillis = System.currentTimeMillis();
Thread.sleep(1000);
long currentTimeMillis1 = System.currentTimeMillis();
System.out.println("task3任务耗时:" + (currentTimeMillis1 - currentTimeMillis));
return new AsyncResult<>("task3执行完毕!");
}
}
@RestController
@RequestMapping
public class FutureAsyncController {
@Autowired
private FutureAsyncTask futureAsyncTask;
@RequestMapping("future/async")
public String doTask() throws InterruptedException {
long currentTimeMillis = System.currentTimeMillis();
Future<String> task1 = futureAsyncTask.task1();
Future<String> task2 = futureAsyncTask.task2();
Future<String> task3 = futureAsyncTask.task3();
while (true) {
if(task1.isDone() && task2.isDone() && task3.isDone())
break;
}
long currentTimeMillis1 = System.currentTimeMillis();
System.out.println("task任务总耗时:" + (currentTimeMillis1 -currentTimeMillis));
return "task任务总耗时:" + (currentTimeMillis1 -currentTimeMillis);
}
}
启动项目,访问接口,查看后台输出结果:
标签:异步,springBoot,System,long,currentTimeMillis,currentTimeMillis1,Async,public 来源: https://blog.csdn.net/m0_37732829/article/details/94394450
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。