开发时遇到问题,修改代码后,@Async怎么都不生效了
原有代码是这样的,控制台可以正常打印,两个线程名字不同
@RestController
public class AController(){
@Resource
private BService bservice;
@GetMapping("/getB")
public T getB(){
System.out.println("打印线程名字"+Thread.currentThread().getName());
return bservice.getB();
}
}
@Service
public class BService(){
@Async
public T getB(){
System.out.println("打印线程名字"+Thread.currentThread().getName());
return XXXX;
}
}
但是由于代码需求,BService类中getB方法需要修改。部分代码不需要异步操作,所以进行以下调整
@Service
public class BService(){
public T getB(){
System.out.println("打印线程名字1"+Thread.currentThread().getName());
//调用异步方法
method();
return XXXX;
}
@Async
public void method(){
System.out.println("打印线程名字2"+Thread.currentThread().getName());
//需要进行异步处理的地方
XXXX;
XXXXX;
//需要进行异步处理的地方
}
}
此时,控制台输出打印线程名字1,和打印线程名字2居然是同一个线程。
查询资料发现:
@Async异步方法在同一个类调用,@Async注解失效,原因是异步方法必须是通过代理机制来触发的,因此如果在同一个类中调用异步方法,它将无法通过代理机制工作。
所以需要将异步方法,放到另一个bean中