关于多线成调用可能大家用的比较多的是JDK的多线程,springboot1.5+,项目框架中集成了异步多线程操作配置,在这里和大家分享一下springboot的异步多线程注解使用,先一步一步来以代码的形式讲解大家可能会遇到的问题。
一:创建方法,然后在方法上添加@Async注解,然后还需要在@SpringBootApplication启动类或者@configure注解类上 添加注解@EnableAsync启动多线程注解,@Async就会对标注的方法开启异步多线程调用,注意,这个方法的类一定要交给spring容器来管理
@Component
public class Test {
//注意这个多线程方法的类一定要加@Component注解,拿给spring容器管理
@Async
public void doTaskThree(int i) {
long start = System.currentTimeMillis();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("第00" + i + "完成任务,耗时:" + (end - start) + "毫秒,线成名为::" + Thread.currentThread().getName());
}
}
然后 其他方法就可以直接调用此方法了,spring会开启多线程异步调用。
注意:关于注解失效需要注意以下几点
1,注解的方法必须是public方法
2,方法一定要从另一个类中调用,也就是从类的外部调用,类的内部调用是无效的,因为@Transactional和@Async注解的实现都是基于Spring的AOP,而AOP的实现是基于动态代理模式实现的。那么注解失效的原因就很明显了,有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器。
3,异步方法使用注解@Async的返回值只能为void或者Future
@Autowired
private Test test;
@Override
public List<Integer> findByMonth() {
List<Integer> list = new ArrayList<>();
for (int i =1;i<=12;i++){
int count= baseMapper.findByMonth(i);
list.add(count);
}
System.out.println("开始执行多线程任务1111111111: