范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

  凭据管理
  在日常生活中,我们经常会遇到一种情况,就是在我们提出需求之后,由于服务者还没有准备好对应的实物交付给我们的时候,就会先给我们一张凭据,等到双方约定的时间到了之后,我们带着这个凭据就可以去获取到我们想要的东西。例如在一个蛋糕店里我们定了一个蛋糕,店长给了我们一个凭据,然后在约定的时间我们去蛋糕店中取走我们定的蛋糕。这样我们不需要在店里等待,而是去完成我们的其他工作。
  在程序开发中假设有一个任务执行的时间比较长,通常需要我们等待这个任务完成之后才能进行后续的任务,这个时候服务的调用者就会一直等待。而我们利用上面的介绍的凭据的方式就完全可以解决调用者等待的问题。也就是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接口@FunctionalInterface public 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();       @Override     public 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();         }     }      @Override     public 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();     }       @Override     public Future<?> submit(Runnable runnable) {          final FutureTask future = new FutureTask<>();         new Thread(()->{             runnable.run();             // 任务执行结束之后将null作为参数返回             future.finish(null);         },getNextName()).start();         return future;     }      @Override     public Future submit(Task task, IN input) {         final FutureTask future = new FutureTask<>();         new Thread(()->{            OUT result = task.get(input);             // 任务执行结束之后,将真实的结果通过finish的方式传递给future             future.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的机制。代码如下    @Override     public Future submit(Task task, IN input, Callback callback) {         final FutureTask future = new FutureTask<>();         new Thread(()->{             OUT result = task.get(input);             // 任务执行结束之后,将真实的结果通过finish的方式传递给future             future.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的高效利用。当然这里我们给出的只是一个基础演示版本,其中的存在的问题还有很多,有兴趣的读者可以自己思考相关内容的优化。

2022跨境电商盘点穿越周期的力量丨霞光WAVE本文系头条科技瞭望2023特约稿件作者金鄞编辑宋函2022年是全球从疫情阴霾中加速走出的一年,对于跨境电商而言,短短三年时间,经历了一个跌宕的周期。2020年,线上经济需求爆炸,整摘时代之要,金沙酒业时代摘要对话时代新力量近日,由贵州金沙窖酒酒业有限公司(以下简称金沙酒业)新华网联合打造的新闻纪实类访谈节目时代摘要第6期走进德力西上线。首播至今,时代摘要已经陆续走进华熙生物特锐德波司登,利亚德岚图汽陈红徐帆同框比美,穿镶钻白裙透着影楼风,小一岁也不占优势头条创作挑战赛女人的年龄,总是格外的隐晦。没有人愿意透露自己的年龄,毕竟大家都想保留最完美的容颜。但其实随着年龄的增长,岁月的苍苍真的会写在脸上。年龄差太大的话,站在一起就一目了然人一辈子能吃多少油?油这样吃更健康想想看,你家的一桶油(5L)能吃多久?2个月还是3个月?据国家卫健委发布的一项调查报告显示,我国居民家庭人均食用油的摄入量为42。1克天,远超过中国营养学会2530g天的推荐量。北比唐僧取经还难!2022年乳企扎堆上市想取代蒙牛伊利,带病小鱼难敌大鱼?本文来源时代周报作者穆瑀宸2022年,乳业企业上市热情高涨。据时代周报记者不完全统计,今年以来,递交IPO或者已经宣布上市计划的乳企共有16家,有以君乐宝乳业集团有限公司(以下简称都说白菜豆腐保平安,所以,大鱼大肉的同时也要清淡点冬日生活打卡季胃和心,总要有一个是满的。所以,全世界的迷茫和忧伤都可以用美食去抵挡!更多家常美食做法,请关注典典小厨。喜欢我的家常美食分享就请点赞收藏评论再顺手转发一下吧!当然如果冷冻50多年,解冻期限已过,1967年第一个冰冻人还有可能复活吗?距离1967年第一个冰冻人解冻期限已过去2年,科技复活无望,将来能实现冰冻复活吗?从理论上来说,冰冻人复活是可能的。但难度,远超普通人的想象。从上世纪50年代起,人们就开始热衷于冰直抵心间的暖流(一)关于苦难苦难是成长路上最好的燃料,有时热情而奔放,有时静谧且低调。有时度过了万里晴空,有时失意了懊恼低落。然而,不要在意,他将成为你前进路上最好的铺垫,助你踏上不平凡的征程,成为你交易截止日前恐分道扬镳的六大球星,罗斯命运多舛,戈登任人宰割天下没有不散的筵席。这句话同样适用于弱肉强食的NBA舞台。无论是高高在上的顶级巨星,亦或者勤勤恳恳的蓝领球员,在这个优胜劣汰的舞台,谁都难逃宿命的安排,离开也许成为这座舞台最心照不中国最美乡愁古村落之一独山村,遗世而美丽独山村,村如其名,遗世而独立。村前孤峰独峙,一湾江水清流。村内古宅古街古牌坊,任时光剪裁。这个被严重低估的避世仙境,是中国最美乡愁村寨30强。入选第一批国家森林乡村,第一批中国传统烟火人间六度书写丨乡愁人间,出走与回归红泥围炉,煮雪烹茶。2022岁末,围炉煮茶成为这个冬天的都市消费新风潮。就在一个月前,11月29日晚,中国茶申遗成功。中国传统制茶技艺及其相关习俗列入联合国教科文组织人类非物质文化
嘴唇出现这4种颜色,说明要养脾了,教你4个中成药,健脾养脾中医认为脾开窍于唇,也就是说,嘴唇的颜色,能反映我们脾胃的健康状态。那如果你的嘴唇,出现了这4种颜色,可能就是我们的身体在发出信号,提醒我们要健脾养脾了。今天贾医生就把这些信号给大气虚不足,生百病!黄芪搭一物泡水喝,气血双补还不上火气血充足,百病全消,黄芪巧搭配泡水喝,气血双补还不上火,大家好我中医朱大夫,说到黄芪啊大家都不陌生,它可是有着补气之王的名头,有很多人啊觉得自己身子比较虚弱,就会泡点黄芪水喝一喝补春日困乏面色差?常备3花2果,缓解疲劳,赶走春困精神好春天到了,春风拂面,草长莺飞的季节,按理来说人们应该更有活力,每天情绪饱满。但其实,大多数打工人每天待在室内,只会陷入春困秋乏夏倦冬眠的魔咒中,每天看起来蔫蔫的,面色差非常没精神。老人说春食甘,病不沾,这里的甘指什么?怎么吃?俗话道,民以食为天。这句老话中,有2层意思,一是填饱肚子乃人生一大事,二是合理饮食对身体健康来说非常重要。在古籍灵枢中,有专门提到,故智者之养生也,必顺四时而适寒暑,即养生之道,应中国男足有希望了中国足球协会主席党委副书记陈戌源涉嫌严重违纪违法,目前正在接受纪检监察机关审查调查。中国男足有希望了,重拳反腐,剔除污秽,卧薪尝胆,绝地反击。让那些曾经藐视我们男足的人,颤抖吧。中A股突然下跌,原因是啥?冠亚军收益逆势创新高!抓住大盘回调良机,参赛赢大奖!每经编辑吴永久粉丝朋友们,今日午后A股出现快速回调,很多投资者一下就懵了。在跳水之前,中国电信中国移动中国联通等巨无霸暴力拉升,几大指数中上证50盘中涨幅遥遥领先,还有就是券商股补只打过24分钟NBA,受邀参加全明星扣篮大赛,奥尼尔他能拿冠军前言NBA官方公布了犹他全明星扣篮大赛的名单,他们分别是小马丁(火箭)特雷墨菲(鹈鹕)希姆斯(尼克斯)和麦克朗(76人)。这四名球员中,麦克朗绝对是特殊的存在,他是唯一一个本赛季没2023年牡丹江海林雪乡横道河子三日自驾游攻略(三)头条创作挑战赛2月5日雪乡景区横道河子大庆冬天总是要去一次雪乡吧。对冬天最美好的回忆,就是一段奇妙的冰雪奇缘。雪乡以其独特的冰雪魅力吸引全国各地的游客前来游玩。老于早晨不到7点从住西藏5天4晚自由行攻略西藏天4晚旅游费用省钱玩法值得一看西藏,神秘雪域,这里有林芝珠穆朗玛峰布达拉宫扎什伦布寺大昭寺巴松措雅鲁藏布江大峡谷等一系列著名景点。但对于第一次去西藏的人来说,过山车般的海拔,神秘的土地,众多的不确定因素让如何选南宁面向东盟布局新赛道加速培育千亿元重点产业图为南宁市第十五届人民代表大会第四次会议记者会现场。黎天勇摄中新网南宁2月16日电(记者黄艳梅)比亚迪智能新能源汽车综合测试场项目开工建设,广西首台半导体光刻设备落地南宁今年以来,第二届广东省药品安全公益短视频大赛颁奖大会举行2月16日,由广东省药品监管局主办广东省药品监管局事务中心承办的药安全粤健康第二届广东省药品安全公益短视频大赛颁奖大会在广州举行。此次大赛以药安全粤健康为主题,共征集来自全省药监系