Java | 一分钟掌握异步编程 | 2 - 异步的实现方式

文章介绍了Java中实现异步编程的几种方式,包括线程异步、Future异步、CompletableFuture异步以及消息队列异步,如RocketMQ、Kafka和RabbitMQ,并提到了Spring的@Async注解和ApplicationEvent事件机制作为其他异步实现方式。
摘要由CSDN通过智能技术生成

作者:Mars酱

声明:本文章由Mars酱编写,部分内容来源于网络,如有疑问请联系本人。

转载:欢迎转载,转载前先请联系我!

前言

废话不多说,因为废话已经在前一篇 Java | 一分钟掌握异步编程 | 1 - 基本概念 - 掘金 (juejin.cn) 多说。但是,这篇还是废话多~

实现异步的几种方式

线程异步

线程异步实际就是把任务丢给多线程去处理,让本来串行的操作转化为并行操作。线程异步方式是JDK种最简单粗暴的方式。

这就好像你点的两碗面,沙县国际集团里面只有一个下面条的师傅,应付你俩一对小情侣还行,但是来十七八个小情侣一起要吃他下面,一个师傅扛不住啊。于是,沙县国际集团会聘请多位下面厉害的师傅,这多个面条师傅就是多线程,每点一个单,空闲的师傅就开始工作,这样就加快了处理效率。

一般实现线程异步使用java.lang.Threadjava.lang.Runnable。如果任务比较多呢,就使用线程池 java.util.concurrent.ThreadPoolExecutor完成。

Future异步

线程异步有个问题:ThreadRunnable是不能获取到返回结果的,就像面条师傅看到有订单了,师傅们只顾着手头的面条功夫,来不及告诉你做没做好,你自己得时不时去看看。那么,程序中也一样,如果你需要返回值,那么需要实现CallableFuture接口,前者负责产生结果,后者负责拿到结果。

我们创建一个任务,这个任务实现Callable接口,用来产生结果,然后把这个任务丢给Future,让它来负责获取结果,如果任务很多,那么我们就丢线程池里玩耍。

但是Future对于任务的编排不是很容易,假设A任务分解为A1和A2,B任务分解为B1和B2,然后A任务和B任务同时完成之后,再做C任务,这个对于Future来说有点繁琐。

CompletableFuture异步

发展到JDK 8,Java 提供了CompletableFuture类,它是基于异步函数式编程的,相对阻塞式等待返回结果,CompletableFuture可以通过回调的方式来处理计算结果,实现了异步非阻塞。

我们创建好任务对象,然后提交给CompletableFuture,最后再通过CompletableFuture拿取结果就行,妈妈再也不用担心异步阻塞的情况了。

消息队列异步

消息队列的异步方式是实际工作中用得最多的了,好处更多,解耦、削峰、可伸缩等等。常用的消息队列有RocketMQ、Kalfka、RabbitMQ等等,架构上也很简单,基本上都由:生产者、消费者、消息队列服务三个大的组件构成。在RocketMq中消息队列服务由 NameServer、Broker 部件组成;Kalfka中是有Kalfka Broker组成,它没有单独的NameServer,依赖于Zookeeper。

其他异步实现方式

异步的实现方式很多,还有Spring的 @Async 注解、ApplicationEvent 事件机制也可以实现异步。

最后

你又快乐的来了一分钟,体力还能再来一分钟吗?行的话v我50

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值