范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

异步调用(java异步方法怎么写)

  异步调用(java异步方法怎么写)
  众所周知,java的代码是同步顺序执行,当我们需要执行异步操作时我们需要创建一个新线程去执行,以往我们是这样操作的:/**  *任务类  */  classTaskimplementsRunnable{@Override  publicvoidrun(){  System.out.println(Thread.currentThread().getName()+":异步任务");  }  }//新建线程并执行任务类  newThread(newTask()).start();
  jdk1.8之后可以使用Lambda 表达式//新建线程并执行任务类newThread(()->{  System.out.println(Thread.currentThread().getName()+":异步任务");  }).start();
  当然,除了显式的new Thread,我们一般通过线程池获取线程,这里就不再展开
  Spring 3.0之后提供了一个@Async注解,使用@Async注解进行优雅的异步调用,我们先看一下API对这个注解的定义:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/Async.html
  本文记录在SpringBoot项目中使用@Async注解,实现优雅的异步调用
  代码与测试
  项目工程结构
  因为要测试事务,所以需要引入<!--添加springdata-jpa依赖-->  <dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-jpa</artifactId>  </dependency>    <!--添加MySQL驱动依赖-->  <dependency>  <groupId>mysql</groupId>  <artifactId>mysql-connector-java</artifactId>  </dependency>
  在启动类开启启用异步调用,同时注入ApplicationRunner对象在启动类进行调用测试packagecn.huanzi.qch.springbootasync;importcn.huanzi.qch.springbootasync.service.TestService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.ApplicationRunner;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.annotation.Bean;importorg.springframework.scheduling.annotation.EnableAsync;importorg.springframework.stereotype.Component;@Component@EnableAsync//开启异步调用@SpringBootApplicationpublicclassSpringbootAsyncApplication{@Autowired  privateTestServicetestService;publicstaticvoidmain(String[]args){  SpringApplication.run(SpringbootAsyncApplication.class,args);  }/**  *启动成功  */  @Bean  publicApplicationRunnerapplicationRunner(){returnapplicationArguments->{  longstartTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":开始调用异步业务");//无返回值//testService.asyncTask();    //有返回值,但主线程不需要用到返回值//Future<String>future=testService.asyncTask("huanzi-qch");  //有返回值,且主线程需要用到返回值//System.out.println(Thread.currentThread().getName()+":返回值:"+testService.asyncTask("huanzi-qch").get());    //事务测试,事务正常提交//testService.asyncTaskForTransaction(false);  //事务测试,模拟异常事务回滚//testService.asyncTaskForTransaction(true);    longendTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":调用异步业务结束,耗时:"+(endTime-startTime));  };  }  }
  看一下我们的测试业务类TestServicepackagecn.huanzi.qch.springbootasync.service;importjava.util.concurrent.Future;publicinterfaceTestService{/**  *异步调用,无返回值  */  voidasyncTask();/**  *异步调用,有返回值  */  Future<String>asyncTask(Strings);/**  *异步调用,无返回值,事务测试  */  voidasyncTaskForTransaction(BooleanexFlag);  }packagecn.huanzi.qch.springbootasync.service;importcn.huanzi.qch.springbootasync.pojo.TbUser;importcn.huanzi.qch.springbootasync.repository.TbUserRepository;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.scheduling.annotation.Async;importorg.springframework.scheduling.annotation.AsyncResult;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;importjava.util.concurrent.Future;@ServicepublicclassTestServiceImplimplementsTestService{@Autowired  privateTbUserRepositorytbUserRepository;@Async  @Override  publicvoidasyncTask(){longstartTime=System.currentTimeMillis();try{//模拟耗时  Thread.sleep(3000);  }catch(InterruptedExceptione){  e.printStackTrace();  }longendTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":voidasyncTask(),耗时:"+(endTime-startTime));  }@Async("asyncTaskExecutor")@Override  publicFuture<String>asyncTask(Strings){longstartTime=System.currentTimeMillis();try{//模拟耗时  Thread.sleep(3000);  }catch(InterruptedExceptione){  e.printStackTrace();  }longendTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":Future<String>asyncTask(Strings),耗时:"+(endTime-startTime));returnAsyncResult.forValue(s);  }@Async("asyncTaskExecutor")@Transactional  @Override  publicvoidasyncTaskForTransaction(BooleanexFlag){//新增一个用户  TbUsertbUser=newTbUser();  tbUser.setUsername("huanzi-qch");  tbUser.setPassword("123456");  tbUserRepository.save(tbUser);if(exFlag){//模拟异常  thrownewRuntimeException("模拟异常");  }  }  }
  配置线程池packagecn.huanzi.qch.springbootasync.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.core.task.AsyncTaskExecutor;importorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;/**  *线程池的配置  */@ConfigurationpublicclassAsyncConfig{privatestaticfinalintMAX_POOL_SIZE=50;privatestaticfinalintCORE_POOL_SIZE=20;@Bean("asyncTaskExecutor")publicAsyncTaskExecutorasyncTaskExecutor(){  ThreadPoolTaskExecutorasyncTaskExecutor=newThreadPoolTaskExecutor();  asyncTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);  asyncTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);  asyncTaskExecutor.setThreadNamePrefix("async-task-thread-pool-");  asyncTaskExecutor.initialize();returnasyncTaskExecutor;  }  }
  配置好后,@Async会默认从线程池获取线程,当然也可以显式的指定@Async("asyncTaskExecutor")
  无返回值/**  *启动成功  */  @BeanpublicApplicationRunnerapplicationRunner(){returnapplicationArguments->{longstartTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":开始调用异步业务");//无返回值  testService.asyncTask();longendTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":调用异步业务结束,耗时:"+(endTime-startTime));  };  }
  有返回值
  有返回值,但主线程不需要用到返回值/**  *启动成功  */  @BeanpublicApplicationRunnerapplicationRunner(){returnapplicationArguments->{longstartTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":开始调用异步业务");//有返回值,但主线程不需要用到返回值  Future<String>future=testService.asyncTask("huanzi-qch");longendTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":调用异步业务结束,耗时:"+(endTime-startTime));  };  }
  有返回值,且主线程需要用到返回值/**  *启动成功  */  @BeanpublicApplicationRunnerapplicationRunner(){returnapplicationArguments->{longstartTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":开始调用异步业务");//有返回值,且主线程需要用到返回值  System.out.println(Thread.currentThread().getName()+":返回值:"+testService.asyncTask("huanzi-qch").get());longendTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":调用异步业务结束,耗时:"+(endTime-startTime));  };  }
  可以发现,有返回值的情况下,虽然异步业务逻辑是由新线程执行,但如果在主线程操作返回值对象,主线程会等待,还是顺序执行
  事务测试
  为了方便观察、测试,我们在配置文件中将日志级别设置成debug#修改日志登记,方便调试logging.level.root=debug
  事务提交/**  *启动成功  */  @BeanpublicApplicationRunnerapplicationRunner(){returnapplicationArguments->{longstartTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":开始调用异步业务");//事务测试,事务正常提交  testService.asyncTaskForTransaction(false);longendTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":调用异步业务结束,耗时:"+(endTime-startTime));  };  }
  模拟异常,事务回滚/**  *启动成功  */  @BeanpublicApplicationRunnerapplicationRunner(){returnapplicationArguments->{longstartTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":开始调用异步业务");//事务测试,模拟异常事务回滚  testService.asyncTaskForTransaction(true);longendTime=System.currentTimeMillis();  System.out.println(Thread.currentThread().getName()+":调用异步业务结束,耗时:"+(endTime-startTime));  };  }
  后记
  SpringBoot使用@Async优雅的异步调用就暂时记录到这里,以后再进行补充
  代码开源
  代码已经开源、托管到我的GitHub、码云:
  GitHub:https://github.com/huanzi-qch/springBoot
  码云:https://gitee.com/huanzi-qch/springBoot
  版权声明
  作者:huanzi-qch
  出处:
  https://www.cnblogs.com/huanzi-qch
  若标题中有"转载"字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.

卖油郎独占花魁原文(卖油郎为什么独占花魁)卖油郎独占花魁原文(卖油郎为什么独占花魁)心高气傲的花魁娘子,为什么心甘情愿委身下嫁卖油郎?大凡才子须佳人,佳人须才子,成佳配,一个愿嫁,一个愿讨。小时候看过这电视剧,现如今读到原苹果7价格多少(苹果7当时售价多少)看文章听音乐是种享受,想听什么留言告知(都是付费无损包)王菲红豆。mp3416来自音频玩机怪咖audio欢迎小伙伴来到经典手机栏目大家好,很多人都喊我音频玩机怪咖,其实并不是这样的今日动力煤价格一览(动力煤价格最新消息)我的钢铁煤炭网动力煤。震惊一煤矿发生煤矿瓦斯突出事故致2人死亡。今年04月13日。动力煤资源今日价格最新报价行情走势来自于我的钢铁网门户网站。月22日天津港动力煤价格行情月22日秦吝啬怎么读(锨怎么读)第二部分韵母发生变化第一组部分字韵母ian变成an鲜,掀,锨xun现xun(现做)和xin(现在)弦,舷,涎xun沿yun第二组部分字韵母in变成n营,萦,莹yn萤,滢,蓥yn欣x朽木白哉小时候(朽木白哉的背景和成长历史)朽木白哉小时候(朽木白哉的背景和成长历史)朽木白哉二次元中像风一样帅气的美男子,美的让人窒息。相貌英俊,蓄长发,眼瞳浅紫色,表情望似冷酷人物性格随故事发展,显露另外一面。头上及颈上熙熙攘攘什么意思(形容街上人少的诗句)焦新龙史公云天下熙熙,皆为利来天下攘攘,皆为利往。凡夫之心,皆遇鱼欲钓见鹿欲猎逢色欲近求财欲敛。故而,官场之中,贪多廉寡。近年多有官员敛财贪色落马之事,见怪不怪,吾既不发指,也不扼今日废铜价格铜线(今日废铜价格表)各地皆不同但相差不会。废铜价格今日报价表相关的行情报价价格分析。江西保太有色金属集团废铜回收价格。电线废铜回收价格一公斤33元左右。晖煌电缆再生公司可以给好的价格,等废铜回收价格相如何判断老公身体出轨(老公和别人睡过怎么看得出)如何判断老公身体出轨(老公和别人睡过怎么看得出)男人出轨后13个征兆婚姻出现问题,有很多的原因,出轨也是其中一个很重要的因素。如果男人外面有其他女人,日常生活中会有一些表现的。有很四大教主(四大教哪四个)四大教主(四大教哪四个)近日,王心凌在微博上晒出了她和杨丞琳可爱同框照透露二人在回家的飞机上偶遇。(3月5日王心凌在微博写道机上相遇Mydear阿琳杨丞琳,杨丞琳也在评论中回复相见黄晓明教主称号怎么来的(angelababy)前段时间看了浪姐2,着实是被黄晓明给圈粉了。以前总觉得他挺油,但是他瘦下来之后是真的帅气。在这档综艺里,他化身暖心大哥哥,给姐姐们端茶送水,照顾她们的情绪,看起来真的很绅士。说到黄复合肥多久施一次(复合肥怎样兑水浇菜)原创纯实践经验之谈讲到怎样正确使用复合肥,必须要以水作为介质。水的作用水是作物蔬菜果树植物等有机物的重要组成部分,是植物体进行光合作用制造有机物的重要原料。植物生长点的细胞,只有在
糖尿病吃什么主食最好(糖尿病人吃哪些主食能最好啊)糖尿病治疗,一定要把饮食手段掌握好,这样不花钱还能控制好血糖,饮食习惯对于2型糖尿病的控制和预防至关重要一糖尿病人吃主食吃什么好?糖尿病人要多吃粗细搭配的复合主食,一方面要增加粗粮糖尿病人吃什么主食(糖尿病吃什么主食和蔬菜最好)生活中有很多人在患上糖尿病后,医生都会建议要控制自己摄取主食的量,因此很多糖尿病人就认为自己过多的吃主食会导致血糖上升,在平时也尽量不吃主食,却不知道在日常不吃主食或者少吃主食,易降血糖食物(餐桌上的降糖食物)降血糖食物(餐桌上的降糖食物)对于血糖高的人群来说,科学合理的调整饮食对于调节血糖有很大帮助,血糖高怎么吃比较好呢?相信下面的三种食物能助您控制血糖。苦瓜食用苦瓜可以有效降低血糖。感冒咳嗽吃什么好(感冒咳嗽一直不好吃什么)大家都知道,患了感冒是件难受的事情,风热感冒的症状有咳嗽发热口干口渴痰多等,除了应该对症吃药以外,也可以挑选一种食材来做辅助食疗,那就是荸荠。荸荠又叫马蹄,是日常生活中常见的一种食子宫肌瘤吃什么好(子宫肌瘤最怕4种食物)子宫肌瘤吃什么好(子宫肌瘤最怕4种食物)患上子宫肌瘤这种疾病不必太过着急,我们一定要及时检查,及时治疗,同时在饮食中多注意一些这种疾病,很快就可以痊愈的,今天就给大家介绍一下子宫肌如何安装ie(ie浏览器无法安装怎么办)问题场景今天由于工作需要安装ie11到win7,本来以为很简单的事情,所以就在微软官网离线下载ie1164位版本直接安装,谁知道提示当前系统不支持。开始以为是下载的版本有问题,于是flow是什么意思(flower是什么意思中文)大家好,我是艾见英语小编,欢迎来到每天学一个词根打卡计划Tobewhoeveryouwanttobe,和我一起来努力吧!1,词根简介词根flu中文含义流动英文含义flow2,单词导魔球修改器怎么用(魔球修改器教输出窗口未响应)很多球迷朋友们会问莫雷的魔球理论到底是什么,且听小编娓娓道来!一魔球长于归纳短于演绎关于魔球火区的讨论已经够多了,这里不详细讨论魔球的具体模型,只是大概的讨论一下,目的是试图弄清楚flow是什么意思(跟着我的flow什么意思)本文为心理与健康特约稿,公众号xinliyujiankang,转载请注明出处。文王薇华中国地质大学客座教授幸福力导师庄子养生篇中有一个脍炙人口的故事,庖丁解牛。故事中有一位姓丁的厨怎么把网页放在桌面(网页怎么添加到桌面快捷方式)在使用小米手机的时候通常会选择使用手机自带的浏览器来进行一些网页的浏览,而我们在浏览一些自己常用的网页的时候,每次输入网页单独打开是一件非常繁琐的事情,很多人会选择在浏览器中设置主浏览器主页被修改(浏览器网页被篡改怎么改回去)浏览器主页被修改(浏览器网页被篡改怎么改回去)大家好,我是工具人猫猫。过去一周我把有名的赖皮软件给体验了个遍,安装了这么多软件,我的浏览器主页没被篡改十次也有八次了,每次都要费九牛