您当前的位置:首页 > 互联网百科 > 百科

互联网面试-请简单介绍高并发场景中的Future设计模式?

时间:2023-01-28 16:34:53  来源:今日头条  作者:架构师面试宝典


 

凭据管理

在日常生活中,我们经常会遇到一种情况,就是在我们提出需求之后,由于服务者还没有准备好对应的实物交付给我们的时候,就会先给我们一张凭据,等到双方约定的时间到了之后,我们带着这个凭据就可以去获取到我们想要的东西。例如在一个蛋糕店里我们定了一个蛋糕,店长给了我们一个凭据,然后在约定的时间我们去蛋糕店中取走我们定的蛋糕。这样我们不需要在店里等待,而是去完成我们的其他工作。

在程序开发中假设有一个任务执行的时间比较长,通常需要我们等待这个任务完成之后才能进行后续的任务,这个时候服务的调用者就会一直等待。而我们利用上面的介绍的凭据的方式就完全可以解决调用者等待的问题。也就是JAVA中常说的Future模式。下面我们就来看看关于Java中的Future模式。

Future设计模式

Future设计模式是从JDK1.5开始出现的,在我们实现多线程操作的时候有常用的两种方式,一种是实现Runnbale接口,一种是继承Thread类,而我们不是太常用的一种方式就是Call接口的方式,这种方式就是类似于Future模式。其实现类图如下。


 

下面我们就来看看Future设计模式的具体实现方式。

接口逻辑定义

Future接口

根据之前的分析我们的票据应当具有两个功能,一个功能是可以通过它获取到我们想要的结果,另一个功能就是通过它我们可以知道我们想要的蛋糕是否制作完成。如下所示。

public interface Future {// 用于返回计算之后的结果T get() throws InterruptedException;// 用于判断任务是否正常执行boolean done();

FutureService接口

FutureService 的主要作用就是任务的提交,而提交任务的方式有两种,一种是不需要返回值的,一种是需要返回值的。代码如下。

public interface FutureService {// 提交不需要进行返回的任务的时候 Future的get方法返回为空Future submit(Runnable runnable);// 提交需要返回值的任务的时候 Future的get方法就是获取到返回值Future submit(Tasktask,IN input);// 静态方法获取到实现实例对象static FutureService newServcie(){return new FutureServiceImpl<>();

Task接口

有了票据,有了服务人员,接下来就是需要有我们需要完成的任务是什么,而Task就是用来提供给调用者实现计算逻辑的任务。可以接受一个参数并且返回最后的结果。有点类似于Callable接口

@FunctionalInterfacepublic interface Task {//给定一个参数经过计算之后得到一个结果OUT get(IN input);Future程序实现

Future接口实现

会发现这个接口实现除了实现Future接口的两个方法之外还增加了一个finish的方法,用来完成任务通知操作。

public class FutureTask implements Future {// 返回结果private T result;//任务是否完成private boolean isDone = false;// 对象锁private final Object LOCK = new Object();@Overridepublic T get() throws InterruptedException {synchronized (LOCK){//当任务还没有完成的时候,调用get方法会被挂起进入阻塞等待while (!isDone){LOCK.wAIt();// 返回计算结果return result;protected void finish(T result){synchronized (LOCK){//balking 设计模式if (isDone){return;// 计算完成,为result指定结果,并且将isDone设置为true,同时唤起等待中的线程this.result = result;this.isDone = true;LOCK.notifyAll();@Overridepublic boolean done() {return isDone;

在FutureTask中使用了线程间的通信wait和notifyAll,当任务没有完成之前通过get方法获取接口,调用方会进入到阻塞状态,直到任务完成之后收到线程唤醒,finish方法接收到任务完成的通知,然后唤醒因为调用了get方法而进入阻塞的线程。

FutureService实现

public class FutureServiceImpl implements FutureService {private final static String FUTURE_THREAD_PREFIX = "FUTURE-";private final AtomicInteger nextCounter = new AtomicInteger(0);private String getNextName(){return FUTURE_THREAD_PREFIX+nextCounter.getAndIncrement();@Overridepublic Future submit(Runnable runnable) {final FutureTask future = new FutureTask<>();new Thread(()->{runnable.run();// 任务执行结束之后将null作为参数返回future.finish(null);},getNextName()).start();return future;@Overridepublic Future submit(Task task, IN input) {final FutureTask future = new FutureTask<>();new Thread(()->{OUT result = task.get(input);// 任务执行结束之后,将真实的结果通过finish的方式传递给futurefuture.finish(result);},getNextName()).start();return future;Future设计模式测试

这里我们提交一个没有返回值的任务,代码如下,

public class FutureTest {public static void main(String[] args) throws InterruptedException {FutureService service = FutureService.newServcie();Future future = service.submit(()->{try {TimeUnit.SECONDS.sleep(10);} catch (InterruptedException e) {e.printStackTrace();System.out.println("任务完成!");future.get();

提交一个有返回值的任务

public class FutureTest {public static void main(String[] args) throws InterruptedException {FutureService service = FutureService.newServcie();Future future = service.submit(input->{try {TimeUnit.SECONDS.sleep(10);} catch (InterruptedException e) {e.printStackTrace();return input.length();},"Hello");System.out.println(future.get());升级获取结果的方法

从上面两个测试的返回结果来看,如果我们调用了future的get方法,那么我们的程序就会进入到阻塞的状态,这个操作与我们的预期不太相符合,这个也是整个的Future模式一直存在的问题。那么我们如何去改进这个获取get方法等待的问题呢?这就引入了一个Callback的机制。代码如下

@Overridepublic Future submit(Task task, IN input, Callback callback) {final FutureTask future = new FutureTask<>();new Thread(()->{OUT result = task.get(input);// 任务执行结束之后,将真实的结果通过finish的方式传递给futurefuture.finish(result);if (null!=callback){callback.call(result);},getNextName()).start();return future;

测试效果,会发现我们课可以不使用get方法就可以完成执行结果的获取。

public class FutureTest {public static void main(String[] args) throws InterruptedException {FutureService service = FutureService.newServcie();service.submit(input->{try {TimeUnit.SECONDS.sleep(10);} catch (InterruptedException e) {e.printStackTrace();return input.length();},"Hello",System.out::println);总结

在之前的分享中很多的地方我们都提到了Future设计模式,通过这篇文章我们也进一步的了解了关于Future设计模式的思想。其核心思想就是模拟了一个凭据场景,通过这种方式来实现对CPU的高效利用。当然这里我们给出的只是一个基础演示版本,其中的存在的问题还有很多,有兴趣的读者可以自己思考相关内容的优化。



Tags:Future   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
异步编程与CompletableFuture
在现代软件开发中,异步编程已经成为一种常见的编程范式。它能够提高程序的性能和响应速度,使得程序在执行I/O密集型操作时能够更加高效地利用系统资源。在异步编程中,一种常见...【详细内容】
2023-12-08  Search: Future  点击:(124)  评论:(0)  加入收藏
Rust的异步编程与Futures
今天,我们来探讨Rust中的异步编程和Futures。Rust的异步编程是一个强大的特性,它允许开发者编写非阻塞的、高性能的应用程序。让我们一起深入了解这一概念及其在Rust中的应用...【详细内容】
2023-11-25  Search: Future  点击:(192)  评论:(0)  加入收藏
互联网面试-请简单介绍高并发场景中的Future设计模式?
凭据管理在日常生活中,我们经常会遇到一种情况,就是在我们提出需求之后,由于服务者还没有准备好对应的实物交付给我们的时候,就会先给我们一张凭据,等到双方约定的时间到了之后...【详细内容】
2023-01-28  Search: Future  点击:(151)  评论:(0)  加入收藏
使用JAVA CompletableFuture实现流水线化并行处理,深度实践总结
在项目开发中,后端服务对外提供API接口一般都会关注响应时长。但是某些情况下,由于业务规划逻辑的原因,我们的接口可能会是一个聚合信息处理类的处理逻辑,比如我们从多个不同的...【详细内容】
2022-10-26  Search: Future  点击:(405)  评论:(0)  加入收藏
奇淫巧技,CompletableFuture 异步多线程是真的优雅
一个示例回顾Future一些业务场景我们需要使用多线程异步执行任务,加快任务执行速度。JDK5新增了Future接口,用于描述一个异步计算的结果。虽然 Future 以及相关使用方法提供...【详细内容】
2022-08-17  Search: Future  点击:(464)  评论:(0)  加入收藏
Java——CompletableFuture详解
平时开发过程中 Runable 、Future 、 Thread 、ExecutorService、Callable 这些和多线程相关的class了解和使用的也比较多,相对来说更加的熟悉和了解。使用起来也更加的得心...【详细内容】
2022-07-30  Search: Future  点击:(431)  评论:(0)  加入收藏
异步编程不会?我教你啊!CompletableFuture
前言以前需要异步执行一个任务时,一般是用Thread或者线程池Executor去创建。如果需要返回值,则是调用Executor.submit获取Future。但是多个线程存在依赖组合,我们又能怎么办?可...【详细内容】
2020-12-09  Search: Future  点击:(236)  评论:(0)  加入收藏
▌简易百科推荐
社交网络与Web3:数字社交的演进
在数字化时代的浪潮下,社交网络已成为人们日常生活的重要组成部分。从早期的在线论坛到如今的社交媒体平台,社交网络已经成为人们交流、分享和获取信息的主要渠道。然而,随着区...【详细内容】
2024-04-12  Rory罗昊在数字化时代的浪潮下,社交网络已成为人们日常生活    Tags:Web3   点击:(5)  评论:(0)  加入收藏
数字化社交的引擎:解析Facebook的影响力
随着数字技术的飞速发展,社交网络已成为人们日常生活中不可或缺的一部分。而在这个数字化社交的世界中,Facebook作为最具影响力和知名度的平台之一,其所扮演的角色越发重要。本...【详细内容】
2024-04-12  田田甜字格    Tags:Facebook   点击:(5)  评论:(0)  加入收藏
年轻人修习“网络隐身术” 透明头像成社交新密语?
空白头像空白名字 保护隐私降低存在感 年轻人修习“网络隐身术”透明头像成社交新密语?标准的头像,统一的昵称,逐渐占领年轻人的社交账号。“momo”大军逐渐形成规模,并在不断地...【详细内容】
2024-04-12    北京青年报  Tags:透明头像   点击:(4)  评论:(0)  加入收藏
虚拟情绪商品走俏网络 花小钱买开心,究竟值不值?
“好运喷雾”“心灵树洞”“爱因斯坦的脑子”&hellip;&hellip;虚拟情绪商品走俏网络花小钱买开心,究竟值不值?本报记者 陈曦《工人日报》(2024年04月11日 03版)分手后下单一份...【详细内容】
2024-04-11    工人日报  Tags:虚拟情绪商品   点击:(5)  评论:(0)  加入收藏
数字社交的新典范:解析Facebook的成功密码
在当今数字化时代,社交媒体已经成为人们日常生活的重要组成部分,而Facebook作为最知名的社交媒体平台之一,其成功之处备受瞩目。本文将深入解析Facebook的成功密码,探讨其在数字...【详细内容】
2024-04-10  清晨张大鹏    Tags:Facebook   点击:(7)  评论:(0)  加入收藏
为什么黄色网站能免费观看?靠什么获利?小心掉入这几个圈套
有一句话叫做,不要轻易靠近免费的东西,它免费的原因是你暂时还没看懂代价!为什么市面上很多黄色网站能让你免费观看?为什么能平白无故给你福利?其实是你想多了,天下没有免费的午餐...【详细内容】
2024-04-10  星星点灯FF    Tags:网站   点击:(6)  评论:(0)  加入收藏
视频号,从抖音挖来一个“一姐”?
文|王亚琪编辑|斯问“你说你要尊严,一个月5000块钱的合同工资,能体现你的尊严吗?”“我那么多的人脉和资源,你如果够聪明的话,你踩着我肩膀往上爬不是更快吗?你拿着我每个月收来的房...【详细内容】
2024-04-09    电商在线  Tags:视频号   点击:(5)  评论:(0)  加入收藏
Web3如何颠覆传统互联网
随着科技的迅速发展,Web3正逐渐成为人们关注的焦点。与传统的Web2相比,Web3代表了一种全新的互联网模式,其潜力和影响力引发了人们对未来的期待和探索。本文将深入探讨Web3如何...【详细内容】
2024-03-29  清晨少少年    Tags:Web3   点击:(8)  评论:(0)  加入收藏
批量生产的俄罗斯美女,正在收割咱爸
南风窗消息,Olga Loiek是一名乌克兰网红,金发碧眼,面容精致,她的视频,多以芭比娃娃气质的造型做封面,内容形式相对单调&mdash;&mdash;对着镜头,分享自己的生命感悟。作为一个名不见...【详细内容】
2024-03-22    上游新闻  Tags:俄罗斯美女   点击:(15)  评论:(0)  加入收藏
内容IP,流量生意之外的另一条道路
来源 | Tech星球文 | 陈桥辉腾讯视频一开年就出了王炸。作为一部在播出前,全网总预约数超过了800万的绝对大热剧,由赵丽颖、林更新主演的仙偶大剧《与凤行》在3月18日首播,开播...【详细内容】
2024-03-20  Tech星球    Tags:内容IP   点击:(16)  评论:(0)  加入收藏
站内最新
站内热门
站内头条