想让springbot的程序能够并行执行,我们除了可以使用多线程来并行地处理任务,也可以使用SpringBoot提供的异步处理方式@Async来处理。只要通过@Async注解就能将普通的同步任务改为异步调用任务。
用@Async注解之前,我们需要在入口类添加注解@EnableAsync开启异步调用
@SpringBootApplication
@ServletComponentScan
@ImportResource(locations={”classpath:spring-mvc.xml”} )
@EnableAsync
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.classargs ) ;
}
}
在AyUserServicelmpl类中实现findAsynAll方法,并在方法中添加异步调用注解@Async,具体代码如下:
@Override
@Async
public Future<List<AyUser> findAsynAll () {
try{
System.out.println("开始做任务");
long start =System.currentTimeMillis() ;
List<AyUser> ayUserList = ayUserRepository.findAll() ;
long end = System.currentTimeMillis() ;
System.out.println("完成任务,耗时"+(end -start)+"毫秒" );
return new AsyncResult<List<AyUser>>(ayUserList);
}catch(Exception e) {
logger.error (" method [findAll] error ", e) ;
}
}
测试:
@Test
public void testAsync2()throws Exception{
long startTime = System.currentTimeMillis();
System.out.println("第一次查询所有用户!");
Future<List<AyUser>> ayUserList=ayUserService.findAsynAll();
System.out.println("第二次查有用户!");
Future<List<AyUser>> ayUserList2 = ayUserService .findAsynAll();
Systemout. prinln("第三次查询所有用户");
Future<List<AyUser > ayUserList3 = ayUserService.findAsynAll() ;
while (true){
if(ayUserList.isDone() && ayUserList2.isDone() &&ayUserList3.isDone()){
break;
}else {
Thread .sleep(lO) ;
long endTime = System.currentTimeMillis() ;
System.out.println(”总共消耗”+(endTime - startTime)+”毫秒”) ;
}
}
}
然后,创建AyUserServiceimpl类的findAll同步的方法,使它能够记录代码执行完成所花费的时间,具体代码如下:
//同步的方法
Override
public List<AyUser> findAll () {
try{
System.out.println(”开始做任务”);
long start= System . currentTimeMillis() ;
List<AyUser> ayUserList= ayUserRepository.findAll();
long end= System.currentTimeMillis();
System.out.println("完成任务,耗时"+(end - start)+”毫秒” );
return ayUserList ;
}catch (E xception e) {
logger.error ("method [findAll] error ", e);
return Collections.EMPTY_LIST;
}
}
测试:
@Test
public void testAsync() {
long startTirne = Systern.currentTimeMillis () ;
Systern.out.println("第一次查询所有用户!");
List ayUserList = ayUserService.findAll();
Systern.out.println("第二次查询所有用户!");
List ayUserList2 = ayUserService.findAll();
Systern.out.println( "第三次查询所有用户!");
List ayUserList3 = ayUserService.findAll();
long endTirne = Systern.currentTirneMillis () ;
Systern.out.println("总共消耗"+(endTirne - startTime )+"毫秒") ;
}
宗上来说 异步的会快于同步的,异步的要用到@Async注解并我们需要在入口类添加注解@EnableAsync开启异步调用。
原创来源:滴一盘技术