@Async使用:
- 1、首先在启动类上开启注解@EnableAsync
- 2、然后需要异步操作的方法上加上@Async
*/
public class AsyncTest {
@Async
public void test() throws InterruptedException {
//做处理
Thread.sleep(1000);
} /**- 如果需要返回值的话,通过AsyncResult进行封装
*/
@Async
public Future testReturn() throws InterruptedException {
//做处理
Thread.sleep(1000);
return new AsyncResult<>(“hello”);
}
} -
// 调用测试接口
@GetMapping(value = "/testAsync") public String testAsync() throws Exception { String a=service.abc(); System.out.println(a); return "abc"; }//测试代码 @Async public void a(String _method, String _param) throws Exception { Thread.sleep(100000); }
直接返回:abc
- 如果需要返回值的话,通过AsyncResult进行封装
注解不生效问题:
@Async注解使用有几个限制:
两个方法都在同一个类里面,只是一个方法调用另一个异步方法,不生效。
解决方法:拆分两个方法,将异步方法单独放在一个类里面,然后再去调用就解决了。
有接口方法的实现类里的注解不生效。
例子:
@Controller类:DemoController
接口:DemoService
接口的实现@Service类:DemoServiceImpl
其中的同步方法为:incr()
DemoController中的实例化为
@Autowired
private DemoService demoService;
1
2
调用的时候为:
demoService.incr();
1
那么这个异步没有效果。
解决方法:在实现类中调用一个没有接口的类才可以。
————————————————
版权声明:本文为CSDN博主「冰红茶不会渴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43241706/article/details/121555913