




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Java中5种异步实现的方式详解目录一、什么是异步二、线程异步三、Future异步四、CompletableFuture异步五、SpringBoot@Async异步六、Guava异步
一、什么是异步
首先我们先来看看一个同步的用户注册例子,流程如下:
在同步操作中,我们执行到插入数据库的时候,我们必须等待这个方法彻底执行完才能执行发送短信这个操作,如果插入数据库这个动作执行时间较长,发送短信需要等待,这就是典型的同步场景。
于是聪明的人们开始思考,如果两者关联性不强,能不能将一些非核心业务从主流程中剥离出来,于是有了异步编程雏形,改进后的流程如下:
这就是异步编程,它是程序并发运行的一种手段,它允许多个事件同时发生,当程序调用需要长时间运行的方法时,它不会阻塞当前的执行流程,程序可以继续运行。
在聊完异步编程后,那么我们一起来看看Java里面实现异步编程究竟有哪些方式呢?
二、线程异步
在Java语言中最简单使用异步编程的方式就是创建一个线程来实现,如果你使用的JDK版本是8以上的话,可以使用Lambda表达式会更加简洁。
publicclassAsyncThreadextendsThread{
@Override
publicvoidrun(){
System.out.println("当前线程名称:"+this.getName()+",执行线程名称:"+Thread.currentThread().getName()+"-hello");
publicstaticvoidmain(String[]args){
//模拟业务流程
//.......
//创建异步线程
AsyncThreadasyncThread=newAsyncThread();
//启动异步线程
asyncThread.start();
}
当然如果每次都创建一个Thread线程,频繁的创建、销毁,浪费系统资源,我们可以采用线程池:
privateExecutorServiceexecutor=Executors.newCachedThreadPool();
publicvoidfun()throwsException{
executor.submit(newRunnable(){
@override
publicvoidrun(){
try{
//要执行的业务代码,我们这里没有写方法,可以让线程休息几秒进行测试
Thread.sleep(10000);
System.out.print("睡够啦~");
}catch(Exceptione){
thrownewRuntimeException("报错啦!!");
将业务逻辑封装到Runnable或Callable中,交由线程池来执行。
三、Future异步
上述方式虽然达到了多线程并行处理,但有些业务不仅仅要执行过程,还要获取执行结果,后续提供在JUC包增加了Future。
从字面意思理解就是未来的意思,但使用起来却着实有点鸡肋,并不能实现真正意义上的异步,获取结果时需要阻塞线程,或者不断轮询。
@Test
publicvoidfutureTest()throwsException{
System.out.println("main函数开始执行");
ExecutorServiceexecutor=Executors.newFixedThreadPool(1);
FutureIntegerfuture=executor.submit(newCallableInteger(){
@Override
publicIntegercall()throwsException{
System.out.println("===taskstart===");
Thread.sleep(5000);
System.out.println("===taskfinish===");
return3;
//这里需要返回值时会阻塞主线程,如果不需要返回值使用是OK的。倒也还能接收
//Integerresult=future.get();
System.out.println("main函数执行结束");
System.in.read();
}
四、CompletableFuture异步
Future类通过get()方法阻塞等待获取异步执行的运行结果,性能比较差。
JDK1.8中,Java提供了CompletableFuture类,它是基于异步函数式编程。相对阻塞式等待返回结果,CompletableFuture可以通过回调的方式来处理计算结果,实现了异步非阻塞,性能更优。
CompletableFuture实现了Future和CompletionStage接口,并提供了多种实现异步编程的方法,如supplyAsync,runAsync以及thenApplyAsync。
下面我们使用CompletableFuture来实现上面的例子:
CompletableFutureLongcompletableFuture=CompletableFuture.supplyAsync(()-factorial(number));
while(!completableFuture.isDone()){
System.out.println("CompletableFutureisnotfinishedyet...");
longresult=completableFuture.get();
我们不需要显式使用ExecutorService,CompletableFuture内部使用了ForkJoinPool来处理异步任务,这使得我们的代码变的更简洁。
五、SpringBoot@Async异步
在@Async注解之前,使用多线程需要使用JDK的原生方法,非常麻烦,当有了@Async之后就比较简单了。
首先,使用@EnableAsync启用异步注解:
@SpringBootApplication
@EnableAsync
publicclassStartApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(StartApplication.class,args);
}
自定义线程池:
@Configuration
@Slf4j
publicclassThreadPoolConfiguration{
@Bean(name="defaultThreadPoolExecutor",destroyMethod="shutdown")
publicThreadPoolExecutorsystemCheckPoolExecutorService(){
returnnewThreadPoolExecutor(3,10,60,TimeUnit.SECONDS,
newLinkedBlockingQueueRunnable(10000),
newThreadFactoryBuilder().setNameFormat("default-executor-%d").build(),
(r,executor)-log.error("systempoolisfull!"));
}
在异步处理的方法上添加注解@Async,当对execute方法调用时,通过自定义的线程池defaultThreadPoolExecutor异步化执行execute方法
@Service
publicclassAsyncServiceImplimplementsAsyncService{
@Async("defaultThreadPoolExecutor")
publicBooleanexecute(Integernum){
System.out.println("线程:"+Thread.currentThread().getName()+",任务:"+num);
returntrue;
}
用@Async注解标记的方法,称为异步方法。在springboot应用中使用@Async很简单:
调用异步方法类上或者启动类加上注解@EnableAsync在需要被异步调用的方法外加上@Async所使用的@Async注解方法的类对象应该是Spring容器管理的bean对象;
六、Guava异步
Guava提供了ListenableFuture类来执行异步操作
1.首先我们需要添加guava的maven依赖:
dependency
groupIdcom.google.guava/groupId
artifactIdguava/artifactId
version28.2-jre/version
/dependency
2.现在我们使用ListenableFuture来实现我们之前的例子:
ExecutorServicethreadpool=Executors.newCachedThreadPool();
ListeningExecutorServiceservice=MoreExecutors.listeningDecorator(threadpool);
ListenableFutureLon
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中音乐与其他学科融合教学的有效策略和实践路径
- 拔尖创新人才培养新路径与行动计划
- 运营直播面试题及答案
- 三方分红合同协议书
- 鱼船出租合同协议书
- 区域合伙合同协议书
- 合同就业协议书怎么填
- 会议咨询服务合同协议书
- 合同协议书为何最优先
- 餐饮协议书合同
- 激光应用技术发展路径试题及答案
- 2025年一级建造师之一建矿业工程实务题库附答案(典型题)
- 国家职业技能标准-(粮油)仓储管理员
- 无人驾驶技术在旅游景区的自动驾驶巴士的创新实践
- 《自动化生产线集成与应用- Integration》课件-项目一 自动化生产线概述
- 履带式起重机进场验收表
- 汽车维修前台接待流程参考指导
- 大数据驱动的智慧社区建设研究
- 《人工智能生成合成内容标识办法》知识讲座
- 2024广西公务员【申论A卷、C卷+2023申论A卷】共3套真题及答案
- 2024北京西城区初一(下)期末英语试题和答案
评论
0/150
提交评论