springboot使用注解@Async开启异步调用

想让springbot的程序能够并行执行,我们除了可以使用多线程来并行地处理任务,也可以使用SpringBoot提供的异步处理方式@Async来处理。只要通过@Async注解就能将普通的同步任务改为异步调用任务。

用@Async注解之前,我们需要在入口类添加注解@EnableAsync开启异步调用

  1. @SpringBootApplication
  2. @ServletComponentScan
  3. @ImportResource(locations={”classpath:spring-mvc.xml”}
  4. @EnableAsync
  5. public class MySpringBootApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(MySpringBootApplication.classargs ) ;
  8. }
  9. }

在AyUserServicelmpl类中实现findAsynAll方法,并在方法中添加异步调用注解@Async,具体代码如下:

  1. @Override
  2. @Async
  3. public Future<List<AyUser> findAsynAll () {
  4. try{
  5. System.out.println"开始做任务");
  6. long start =System.currentTimeMillis() ;
  7. List<AyUser> ayUserList = ayUserRepository.findAll() ;
  8. long end = System.currentTimeMillis() ;
  9. System.out.println"完成任务,耗时"+(end -start)+"毫秒" );
  10. return new AsyncResult<List<AyUser>>(ayUserList);
  11. }catch(Exception e) {
  12. logger.error (" method [findAll] error ", e) ;
  13. }
  14. }

测试:

  1. @Test
  2. public void testAsync2()throws Exception{
  3. long startTime = System.currentTimeMillis();
  4. System.out.println"第一次查询所有用户!");
  5. Future<List<AyUser>> ayUserList=ayUserService.findAsynAll();
  6. System.out.println"第二次查有用户!");
  7. Future<List<AyUser>> ayUserList2 = ayUserService .findAsynAll();
  8. Systemout. prinln"第三次查询所有用户");
  9. Future<List<AyUser > ayUserList3 = ayUserService.findAsynAll() ;
  10. while (true){
  11. if(ayUserList.isDone() && ayUserList2.isDone() &&ayUserList3.isDone()){
  12. break;
  13. }else {
  14. Thread .sleep(lO) ;
  15. long endTime = System.currentTimeMillis() ;
  16. System.out.println(”总共消耗”+(endTime - startTime)+”毫秒”)
  17. }
  18. }
  19. }

然后,创建AyUserServiceimpl类的findAll同步的方法,使它能够记录代码执行完成所花费的时间,具体代码如下:

  1. //同步的方法
  2. Override
  3. public List<AyUser> findAll () {
  4. try{
  5. System.out.println(”开始做任务”);
  6. long start= System . currentTimeMillis() ;
  7. List<AyUser> ayUserList= ayUserRepository.findAll();
  8. long end= System.currentTimeMillis();
  9. System.out.println"完成任务,耗时"+(end - start)+”毫秒” );
  10. return ayUserList ;
  11. }catch (E xception e) {
  12. logger.error ("method [findAll] error ", e);
  13. return Collections.EMPTY_LIST;
  14. }
  15. }

测试:

  1. @Test
  2. public void testAsync() {
  3. long startTirne = Systern.currentTimeMillis () ;
  4. Systern.out.println("第一次查询所有用户!");
  5. List ayUserList = ayUserService.findAll();
  6. Systern.out.println("第二次查询所有用户!");
  7. List ayUserList2 = ayUserService.findAll();
  8. Systern.out.println( "第三次查询所有用户!");
  9. List ayUserList3 = ayUserService.findAll();
  10. long endTirne = Systern.currentTirneMillis () ;
  11. Systern.out.println("总共消耗"+(endTirne - startTime )+"毫秒") ;
  12. }

宗上来说 异步的会快于同步的,异步的要用到@Async注解并我们需要在入口类添加注解@EnableAsync开启异步调用。