高并发设计思想之Future模式

本文深入探讨并行设计模式在JAVA企业级应用中的作用,通过Future模式解释如何解决线程等待问题,提升多线程应用效率。介绍了Future模式的参与者及其实现方式,展示了JDK并发包中Future模式的应用。

并行程序设计模式

并行设计模式是设计优化的一部分,在大型 JAVA企业级应用中,对常用的多线程结构的总结和抽象。与串行程序相比,并行程序的结构通常更为复杂。合理地使用并行模式在多线程开发中,对应用的底层架构代码搭建有着牢固地基的作用。把公开课的内容整理了一下,希望对大家有帮助。

先来思考两个问题,也许在面试中你会被问到。

问题一:你在实际开发中遇到并行设计问题吗?问题二:如果遇到,你是如何在处理 A 线程等待 很慢的B 线程返回结果的?

在传统的单线程环境下,调用函数是同步的,也就是说它必须等到服务器程序返回结果后,才能进行其他处理。

如果这时服务器的处理时间比较长,将会使用户等待时间过长,降低效率。

Future模式:

在Future模式下,调用方式改为异步,而原先 等待返回的时间段,在主调用函数中,则可用于处理其他事务。

下图显示了一个广义 Future模式的实现,从Data_ Future对象可以看到,虽然call本身仍然需要很长一段时间来处理程序,但是,服务程序不等数据处理完成便立即返回客户端一个伪造的数据(相当于商品的订单,而不是商品本身),实现了Future模式的客户端在拿到这个返回结果后,并不急于对其进行处理,而去调用了其他业务逻辑,充分利用了等待时间,这就是Future模式的核心所在。

Future模式的主要参与者:

Main:系统启动,调用 Client发出请求

Client:返回 Data对象,立即返回FutureData,并开启 ClientThread线程装配 RealData

Data:返回数据接口

FutureData:Future数据,构造很快,但是是一个虚拟的数据,需要装配 RealData

RealData:真实数据,其构造是比较慢的

代码实现:

小结:

总而言之, Future模式对于多线程而言,如果线程A要等待线程B的结果,那么线程A没必要一直等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果时再取真实的结果值。

Future模式 JDK 支持

Future模式如此常用,以至于在 JDK 的并发包中,就已经内置了一种 Future模式的实现。而 JDK 的实现相对复杂一些,提供了更为丰富的多线程控制功能,但其中的基本用意和核心概念是完全一致的。

代码实现:

最重要的模块是FutureTask类,它实现了Runnable接口,作为单独的线程运。在其run()方法中,通过Sync内部类,调用Callable接口,并维护Callable接口的返回对象。当使用FutureTask.get()方法时,将返回Callable接口的返回对象。除此以外,通过 Future接口提供的一系列方法,FutureTask还可以对任务本身进行其他控制操作。比如取消Future任务或设定Future任务超时时间。

boolean cancel(boolean mayInterruptIfRunning) //取消任务boolean isCancelled() //是否已经取消boolean isDone() //是否已完成V get() throws InterruptedException, ExecutionException; //取得返回对象V get(long timeout, TimeUnit unit) //取得返回对象,可以设置超时时间

最后总结一下,Future模式在高并发场景下是非常常见的使用套路,分布式开发中,大数据量的业务处理往往都会比较耗时,例如数据统计功能、日志备份功能,列表查询功能等

线程的异步处理同步通知策略:模拟实例应用见:https://blog.csdn.net/qq_31854907/article/details/100079445

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值