专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

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

  凭据管理
  在日常生活中,我们经常会遇到一种情况,就是在我们提出需求之后,由于服务者还没有准备好对应的实物交付给我们的时候,就会先给我们一张凭据,等到双方约定的时间到了之后,我们带着这个凭据就可以去获取到我们想要的东西。例如在一个蛋糕店里我们定了一个蛋糕,店长给了我们一个凭据,然后在约定的时间我们去蛋糕店中取走我们定的蛋糕。这样我们不需要在店里等待,而是去完成我们的其他工作。
  在程序开发中假设有一个任务执行的时间比较长,通常需要我们等待这个任务完成之后才能进行后续的任务,这个时候服务的调用者就会一直等待。而我们利用上面的介绍的凭据的方式就完全可以解决调用者等待的问题。也就是Java中常说的Future模式。下面我们就来看看关于Java中的Future模式。Future设计模式
  Future设计模式是从JDK1。5开始出现的,在我们实现多线程操作的时候有常用的两种方式,一种是实现Runnbale接口,一种是继承Thread类,而我们不是太常用的一种方式就是Call接口的方式,这种方式就是类似于Future模式。其实现类图如下。
  下面我们就来看看Future设计模式的具体实现方式。接口逻辑定义
  Future接口
  根据之前的分析我们的票据应当具有两个功能,一个功能是可以通过它获取到我们想要的结果,另一个功能就是通过它我们可以知道我们想要的蛋糕是否制作完成。如下所示。publicinterfaceFutureT{用于返回计算之后的结果Tget()throwsInterruptedException;用于判断任务是否正常执行booleandone();}
  FutureService接口
  FutureService的主要作用就是任务的提交,而提交任务的方式有两种,一种是不需要返回值的,一种是需要返回值的。代码如下。publicinterfaceFutureServiceIN,OUT{提交不需要进行返回的任务的时候Future的get方法返回为空Futurelt;?submit(Runnablerunnable);提交需要返回值的任务的时候Future的get方法就是获取到返回值FutureOUTsubmit(TaskIN,OUTtask,INinput);静态方法获取到实现实例对象staticT,RFutureServiceT,RnewServcie(){returnnewFutureServiceImpl();}}
  Task接口
  有了票据,有了服务人员,接下来就是需要有我们需要完成的任务是什么,而Task就是用来提供给调用者实现计算逻辑的任务。可以接受一个参数并且返回最后的结果。有点类似于Callable接口FunctionalInterfacepublicinterfaceTaskIN,OUT{给定一个参数经过计算之后得到一个结果OUTget(INinput);}Future程序实现
  Future接口实现
  会发现这个接口实现除了实现Future接口的两个方法之外还增加了一个finish的方法,用来完成任务通知操作。publicclassFutureTaskTimplementsFutureT{返回结果privateTresult;任务是否完成privatebooleanisDonefalse;对象锁privatefinalObjectLOCKnewObject();OverridepublicTget()throwsInterruptedException{synchronized(LOCK){当任务还没有完成的时候,调用get方法会被挂起进入阻塞等待while(!isDone){LOCK。wait();}返回计算结果returnresult;}}protectedvoidfinish(Tresult){synchronized(LOCK){balking设计模式if(isDone){return;}计算完成,为result指定结果,并且将isDone设置为true,同时唤起等待中的线程this。resultresult;this。isDonetrue;LOCK。notifyAll();}}Overridepublicbooleandone(){returnisDone;}}
  在FutureTask中使用了线程间的通信wait和notifyAll,当任务没有完成之前通过get方法获取接口,调用方会进入到阻塞状态,直到任务完成之后收到线程唤醒,finish方法接收到任务完成的通知,然后唤醒因为调用了get方法而进入阻塞的线程。
  FutureService实现publicclassFutureServiceImplIN,OUTimplementsFutureServiceIN,OUT{privatefinalstaticStringFUTURETHREADPREFIXFUTURE;privatefinalAtomicIntegernextCounternewAtomicInteger(0);privateStringgetNextName(){returnFUTURETHREADPREFIXnextCounter。getAndIncrement();}OverridepublicFuturelt;?submit(Runnablerunnable){finalFutureTaskVoidfuturenewFutureTask();newThread((){runnable。run();任务执行结束之后将null作为参数返回future。finish(null);},getNextName())。start();returnfuture;}OverridepublicFutureOUTsubmit(TaskIN,OUTtask,INinput){finalFutureTaskOUTfuturenewFutureTask();newThread((){OUTresulttask。get(input);任务执行结束之后,将真实的结果通过finish的方式传递给futurefuture。finish(result);},getNextName())。start();returnfuture;}}Future设计模式测试
  这里我们提交一个没有返回值的任务,代码如下,publicclassFutureTest{publicstaticvoidmain(String〔〕args)throwsInterruptedException{FutureServiceVoid,VoidserviceFutureService。newServcie();Futurelt;?futureservice。submit((){try{TimeUnit。SECONDS。sleep(10);}catch(InterruptedExceptione){e。printStackTrace();}System。out。println(任务完成!);});future。get();}}
  提交一个有返回值的任务publicclassFutureTest{publicstaticvoidmain(String〔〕args)throwsInterruptedException{FutureServiceString,IntegerserviceFutureService。newServcie();FutureIntegerfutureservice。submit(input{try{TimeUnit。SECONDS。sleep(10);}catch(InterruptedExceptione){e。printStackTrace();}returninput。length();},Hello);System。out。println(future。get());}}升级获取结果的方法
  从上面两个测试的返回结果来看,如果我们调用了future的get方法,那么我们的程序就会进入到阻塞的状态,这个操作与我们的预期不太相符合,这个也是整个的Future模式一直存在的问题。那么我们如何去改进这个获取get方法等待的问题呢?这就引入了一个CallBack的机制。代码如下OverridepublicFutureOUTsubmit(TaskIN,OUTtask,INinput,CallbackOUTcallback){finalFutureTaskOUTfuturenewFutureTask();newThread((){OUTresulttask。get(input);任务执行结束之后,将真实的结果通过finish的方式传递给futurefuture。finish(result);if(null!callback){callback。call(result);}},getNextName())。start();returnfuture;}
  测试效果,会发现我们课可以不使用get方法就可以完成执行结果的获取。publicclassFutureTest{publicstaticvoidmain(String〔〕args)throwsInterruptedException{FutureServiceString,IntegerserviceFutureService。newServcie();service。submit(input{try{TimeUnit。SECONDS。sleep(10);}catch(InterruptedExceptione){e。printStackTrace();}returninput。length();},Hello,System。out::println);}}总结
  在之前的分享中很多的地方我们都提到了Future设计模式,通过这篇文章我们也进一步的了解了关于Future设计模式的思想。其核心思想就是模拟了一个凭据场景,通过这种方式来实现对CPU的高效利用。当然这里我们给出的只是一个基础演示版本,其中的存在的问题还有很多,有兴趣的读者可以自己思考相关内容的优化。

三秦好物嗨购长安2023陕西省名优新特产品展销会将在西安启幕三秦有好物,嗨购在长安。2023陕西省名优新特产品展销会将于3月17日在西安嘉会坊启幕。届时,来自全省12个市(区)百余家知名消费品企业将携千余种名优新特产品集中亮相,为市民游客带长途旅行,警惕致命血栓春暖花开,正是出游好时节。随着天气转暖,不少人将出游提上日程,陈阿姨最近却遇上了一桩糟心事。经历近十个小时的长途飞行,一下飞机,陈阿姨自觉胸闷胸痛气短,喘不过气来。所幸家属及时拨打松滋有条红旗渠湖北日报客户端讯(通讯员李媛媛卢星同)依山傍水山峦起伏,走进松滋市卸甲坪乡天生桥煤矿遗址,植被繁茂,树影摇曳,有着天坑绝壁溶洞等多种地质景观,山景与春色相映成趣。拾级而上,悬挂山腰文旅局长们卷出圈,当地旅游热度上涨了没?近年来,有文旅局长因为短视频意外走红后,全国各地的文旅局长纷纷效仿宣布出战,换装排舞骑马撑伐,使出浑身解数为家乡代言,火出了圈。有网友评论称现在没点才艺,都当不了文旅局局长。新疆伊山东一家人翻建老宅挖出12瓶茅台,归谁所有?变卖后够青岛买房吗李先生是土生土长的山东青岛人,如今青岛的高速发展也带动了当地经济,尤其是青岛市区的房价,比山东其它地市高数一倍还多。李先生在青岛一家公司上班,每月的工资除了开销到了月底几乎所剩无几晋商大院追溯历史红色太行感悟精神晋中向西安市民发出邀请函希望广大嘉宾朋友们能感受晋中的真情接受晋中的邀请,到晋中来走一走看一看,到晋商大院中追溯历史,踏红色太行山感悟精神,在都市乡村间休闲娱乐日前,2023年晋中文旅招商推介会走进西安,辽宁人喝酒不讲排面只讲实惠,这4款酒亲民又好喝,是酒桌的常客提起辽宁来,你能想到的是耿直的气性还是中国第一艘航母亦或者是辽宁的钢铁石油等产业?相信每个人心目中都有一番计较。辽宁古时候称为幽州,历史底蕴非常的深厚,而且东北的酒文化也非常的浓郁狂飙稳坐收视冠军,反派人气排名,重新洗牌,阿如那断层第一!扫黑爆款剧狂飙口碑远超预期,可能就连导演徐纪周都没想到,这部剧居然可以引起全网如此强烈的轰动,按道理来说,一部剧的热度,随着它的收官,很快就被观众淡忘,毕竟每天都会推出不同类型的新贾玲被曝给范冰冰弟弟生孩?男方霸气回应!贾玲一直是老陈比较喜欢的喜剧明星,在很多综艺节目中她都体现了很高的情商,非常能接梗,尤其是跟沈腾在一起的时候,往往会有很好的化学反应,节目效果拉满。另外贾玲也非常有才华,除了在小品法律科普种植毒品原植物的行为是否构成犯罪?头条创作挑战赛大家十分清楚毒品对人的危害,一个人如果长期服用毒品,轻则浑身无力无精打采,重则吸食成瘾影响健康危及生命。清朝末期,英国向我国输入大量鸦片,不少民众开始吸食鸦片。吸食鸦2023年辽宁省退休人员医保进账标准,是多少?一起来看!辽宁省建立职工医保门诊共济保障机制,调整退休人员个人医保账户划账标准,事关退休人员的钱袋子。按照文件要求,辽宁省并未明确统一标准,而是由所辖地区自主确定。今天,我就带大家一起来看一
郭艾伦208赵继伟1115辽宁7人上双终结深圳9连胜直播吧3月19日讯CBA常规赛,辽宁主场迎战深圳。辽宁高居联赛第二,深圳排在第四。上半场,深圳反客为主率先发力,萨林杰连续拿分带队取得两位数领先,随后辽宁大举反击,多点开花轰出21辽宁营口市五大旅游景点辽河公园依河而建的带状公园,一年四季景不同辽河公园是营口市惟一滨河带状公园,位于辽河大街中段,因北依大辽河而得名。该公园始建于1964年,1981年扩建,面积由原4万平方米扩建到1女老虎郝春荣口头上反腐,却暗中贪污,被捕前号召部下廉政有些人生来就过得一帆风顺,从未经历过失败和挫折。或许就是因为成功来得太容易,他们才不懂得珍惜,才会在诱惑面前迷失了自我。2022年,辽宁省副省长郝春荣被双开,成为虎年首个落马的女老得劲!大老虎崔茂虎被查从教师仅5步到中央,履历完美,可惜?国家又打着大老虎了!看了高兴!中央统战部副部长,国家宗教事务局局长崔茂虎被查,这也是一个副部级大老虎,为什么这样说,这样级别的干部在全国统战系统来说,没有几个,屈指可数,妥妥的大老长视频平台的降本增效是个伪命题!近年来,随着短视频直播等新兴形式的崛起,长视频平台面临着流量分流和用户时长缩短的挑战。同时,由于内容成本的高昂和竞争的激烈,除了芒果TV外,其他主要的长视频平台都处于亏损状态。为了林葳大战崔永熙!CBA第37轮最精彩看点两个新秀的对决,很可能会成为CBA联赛里一场最高贵的篮球精英对杀,因为它不光代表了男篮未来的希望,而且这两个新秀身上,有牵动无数球迷的勇冠三军一往无前遇强愈强的凛凛气场和热血情怀。园博园簕杜鹃花开千层瀑成深圳网红打卡点南都讯记者张小玲古有烟花三月下扬州,今有三月赏花来鹏城。3月春日萌发,万物生长,深圳已是花满鹏城,花香四溢。春日里的园博园汇芳园极为热闹,挤满了慕名而来的赏花市民,还有那花开热闹如西媒为防止其他球队引诱卡马文加,皇马想和他续约直播吧3月18日讯据西媒Relevo的报道,为防止其他球队引诱卡马文加,皇马想和他续约。卡马文加这个赛季进步明显,截止目前他已经代表皇马出场41次,在皇马卡塔尔世界杯后的21场比赛威尔哲2713浙江总经理主帅遭驱逐东阳光险胜浙江终结对手10连胜北京时间3月18日,CBA常规赛,东阳光主场以9794险胜浙江,东阳光取得3连胜,同时终结对手10连胜的疯狂势头。浙江队的总经理方俊和主教练王世龙遭到驱逐。东阳光队威尔哲27分13瓜迪奥拉迪亚斯态度很好他在场上场下都影响着球队近日,瓜迪奥拉在接受俱乐部官网时谈到了迪亚斯,他表示这位球员是在为团队做贡献,他在场上场下都影响着球员。瓜迪奥拉说道迪亚斯不只是在踢自己的比赛,他是在为团队做贡献,他有能力发现并解宫鲁鸣爱将坑完深圳坑首钢5000万天价转会费苏伟都比他强他曾是中国男篮被寄予厚望的新星,出道时被称为易建联接班人,一度被深圳男篮重点培养,结果打成蓝领,如今首钢为他不惜花费5000万转会费,结果再度证明自己水平糟糕,他就是李慕豪。本赛季
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网