随笔 springboot @Async注解
程序员文章站
2022-04-19 21:27:47
...
在springboot中使用异步线程,需使用@Async注解。
在启动类上需增加@EnableAsync(proxyTargetClass = true),proxyTargetClass为选择何种代理,
@SpringBootApplication
@EnableAsync(proxyTargetClass = true)
public class ChuanApplication {
public static void main(String[] args) {
SpringApplication.run(ChuanApplication.class, args);
}
}
controller:
@RestController
@RequestMapping("test")
public class AsyncController {
@Autowired
public AsyncTest asyncTest;
@RequestMapping(value = "testAsync",method = RequestMethod.GET)
public void testAsync(){
System.out.println("当前时间:"+LocalTime.now());
List<Future<String>> list =new ArrayList<>();
try {
asyncTest.threadTest1();
Future<String> future2= asyncTest.threadTest2();
list.add(future2);
Future<String> future3 =asyncTest.threadTest3();
list.add(future3);
Thread.sleep(1000);
System.out.println("执行阻塞!");
list.stream().forEach(future-> {
try {
System.out.println(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
});
}catch (Exception e){
e.printStackTrace();
}
System.out.println("结束时间:"+LocalTime.now());
}
}
service:
@Service
public class AsyncTest {
@Async
public void threadTest1(){
System.out.println("当前线程名:"+Thread.currentThread().getName());
try{
Thread.sleep(5000);
System.out.println("线程:"+Thread.currentThread().getName()+"执行结束,时间为:"+ LocalTime.now());
}catch (Exception e){
e.printStackTrace();
}
}
@Async
public Future<String> threadTest2(){
System.out.println("当前线程名:"+Thread.currentThread().getName());
try{
Thread.sleep(3000);
System.out.println("线程:"+Thread.currentThread().getName()+"执行结束,时间为:"+ LocalTime.now());
}catch (Exception e){
e.printStackTrace();
}
return new AsyncResult<>("成功!"+Thread.currentThread().getName());
}
@Async
public Future<String> threadTest3(){
System.out.println("当前线程名:"+Thread.currentThread().getName());
try{
Thread.sleep(4000);
System.out.println("线程:"+Thread.currentThread().getName()+"执行结束,时间为:"+ LocalTime.now());
}catch (Exception e){
e.printStackTrace();
}
return new AsyncResult<>("成功!"+Thread.currentThread().getName());
}
}
运行结果:
当前时间:18:18:25.625
当前线程名:task-3
当前线程名:task-4
当前线程名:task-5
执行阻塞!
线程:task-4执行结束,时间为:18:18:28.638
成功!task-4
线程:task-5执行结束,时间为:18:18:29.638
成功!task-5
结束时间:18:18:29.638
线程:task-3执行结束,时间为:18:18:30.638
在这里进行一个实验,将threadTest2()和threadTest3()进行阻塞,阻塞是通过future.get()方法实现。threadTest1()则不进行阻塞。
如果异步返回,需返回Future<T>,return为AsyncResult<T>。
上一篇: windows下安装服务报错:registry key already exists
下一篇: java command line error opening registry key 'Software\JavaSoft\Java Runtime Environment' java.dll
推荐阅读
-
springboot使用Mybatis(xml和注解)过程全解析
-
关于Spring注解@Async引发其他注解失效的解决
-
SpringBoot —— AOP注解式拦截与方法规则拦截
-
SpringBoot系列-整合Mybatis(注解方式)
-
SpringBoot Application注解原理及代码详解
-
SpringBoot使用AOP+注解实现简单的权限验证的方法
-
springboot~Transactional注解的注意事项
-
SpringBoot中神奇的@Enable*注解?
-
springBoot 依赖管理 自动配置,容器功能 ,以及配置常用注解详解
-
浅谈基于SpringBoot实现一个简单的权限控制注解