自适应网站优点缺点网站模块化

diannao/2025/10/16 5:36:14/文章来源:
自适应网站优点缺点,网站模块化,网站建设成都创新互联,怎么通过互联网做一个服务的网站一、前言 CompletableFuture 是 Java 8 引入的一个功能强大的类#xff0c;用于异步编程。它表示一个可能尚未完成的计算的结果#xff0c;你可以对其添加回调函数来在计算完成时执行某些操作。在 Spring Boot 应用中#xff0c;CompletableFuture 可以用于提高应用的响应性…一、前言 CompletableFuture 是 Java 8 引入的一个功能强大的类用于异步编程。它表示一个可能尚未完成的计算的结果你可以对其添加回调函数来在计算完成时执行某些操作。在 Spring Boot 应用中CompletableFuture 可以用于提高应用的响应性和吞吐量。 二、为什么使用异步编程 场景描述进入用户个人中心调用接口。接口需要返回用户基础信息、用户积分、用户等级等假设用户基础信息查询耗时300ms查询用户积分、用户等级分别耗时200ms那么接口返回就需要700ms了。那么我们如何去优化呢 如果采用异步多线程并行形式接口将以用户基础信息查询耗时300ms最慢的为主接口性能提升一倍查询任务越多则其性能提升越大 三、异步编程介绍 在Java中Callable、Runnable、Future和CompletableFuture是用于处理并发编程的重要接口和类。它们各自有不同的用途和特性下面是对它们的简要介绍 1. Callable   Callable是一个接口用于定义返回结果或抛出异常的任务。它类似于Runnable但Runnable没有返回值且不能抛出受检异常。Callable接口中定义了一个call()方法该方法可以返回一个值并且可以抛出一个受检异常。 2. Runnable   Runnable是一个接口用于定义没有返回值且不抛出受检异常的任务。它只有一个run()方法用于执行任务的代码。通常Runnable对象会被传递给Thread对象的构造函数来创建新线程。 3. Future   Future是一个接口用于表示异步计算的结果。它是Java并发包java.util.concurrent的一部分。当你提交一个Callable任务给ExecutorService时它会返回一个Future对象该对象表示异步计算的结果。你可以使用Future的get()方法来等待计算完成并获取结果或者使用isDone()方法来检查计算是否完成。 4. CompletableFuture   CompletableFuture是Java 8中引入的一个类实现了Future和CompletionStage接口。它提供了函数式编程的能力来处理异步编程并允许你链式地组合多个异步操作。CompletableFuture提供了许多方法如thenApply(), thenAccept(), thenCompose(), exceptionally()等这些方法允许你定义当异步操作完成时应该执行的操作。 CompletableFuture相对于Future的优势在于它提供了更丰富的API来处理异步计算的结果并支持链式调用和组合多个异步操作。这使得编写异步代码更加简洁和直观。 四、CompletableFuture中的函数式编程 在CompletableFuture类中的方法很多都是Function函数式接口方法为入参所以我们先要有一定的认识。 SupplierU // 生产者没有入参有返回结果ConsumerT // 消费者有入参但是没有返回结果FunctionT,U// 函数有入参又有返回结果五、CompletableFuture核心方法介绍 5.1. 创建异步任务 supplyAsync: 异步执行一个给定的Supplier函数并返回一个新的CompletableFuture其结果由Supplier决定。 CompletableFutureVoid/Type supplyAsync(SupplierU supplier)CompletableFutureVoid/Type supplyAsync(SupplierU supplier, Executor executor)允许指定执行器。runAsync: 异步执行一个Runnable任务由于没有返回值所以返回的CompletableFuture类型为Void。 CompletableFutureVoid runAsync(Runnable runnable)CompletableFutureVoid runAsync(Runnable runnable, Executor executor)允许指定执行器。5.1.1. 代码示例 supplyAsync CompletableFutureStringfutureCompletableFuture.supplyAsync(()-{System.out.println(compute test);return test; });String result future.join();System.out.println(get result: result);runAsync CompletableFutureVoid future CompletableFuture.runAsync(()-{System.out.println(compute test); });System.out.println(get result: future.join());指定线程池 ExecutorService executorService new ThreadPoolExecutor(2, 10, 60, TimeUnit.SECONDS, new ArrayBlockingQueue(100));CompletableFutureUser task1 CompletableFuture.supplyAsync(()-{User userInfo userService.getUserInfo(1);return userInfo; }, executorService);// 获取结果 User user task1.get();5.2. 流式连接函数介绍 流式连接函数也称为组合函数允许你以函数式编程的方式组合和链接多个异步操作。 假如我有两个任务任务2需要等任务1执行完成后拿到任务1中的结果作为任务2的参数这时候就需要用到流式连接函数。 ①. thenApply 和 thenApplyAsync thenApply: 当前CompletableFuture计算完成时应用给定的函数到其结果上并返回表示该结果的新的CompletableFuture。 thenApplyAsync: 与thenApply类似但异步执行给定的函数。 ②. thenAccept 和 thenAcceptAsync thenAccept: 当当前CompletableFuture计算完成时执行给定的动作到其结果上然后返回void。 thenAcceptAsync: 与thenAccept类似但异步执行给定的动作。 ③. thenRun 和 thenRunAsync thenRun: 当当前CompletableFuture计算完成时执行给定的动作不关注其结果。 thenRunAsync: 与thenRun类似但异步执行给定的动作。 ④. thenCombine 和 thenCombineAsync thenCombine: 接收另一个CompletableFuture并返回一个新的CompletableFuture该CompletableFuture在当前CompletableFuture和另一个CompletableFuture都完成计算后使用它们的结果来计算值。 thenCombineAsync: 与thenCombine类似但异步执行给定的函数。 ⑤. thenCompose 和 thenComposeAsync thenCompose: 当当前CompletableFuture计算完成时应用给定的函数到其结果上该函数返回一个新的CompletableFuture并返回表示该新CompletableFuture的结果的CompletableFuture。 thenComposeAsync: 与thenCompose类似但异步执行给定的函数。 ⑥. whenComplete 和 whenCompleteAsync whenComplete: 当当前CompletableFuture正常完成或出现异常时执行给定的动作。动作有两个参数结果如果操作正常完成或异常如果抛出异常以及一个表示该CompletableFuture的Throwable如果操作抛出异常则为null。 whenCompleteAsync: 与whenComplete类似但异步执行给定的动作。 ⑦. handle 和 handleAsync handle: 当当前CompletableFuture正常完成或出现异常时应用给定的函数到其结果或异常上并返回一个新的CompletableFuture其结果是函数的结果。 handleAsync: 与handle类似但异步执行给定的函数。 注意带Async后缀的函数表示需要连接的后置任务会被单独提交到线程池中从而相对前置任务来说是异步运行的。除此之外两者没有其他区别。 在使用Async后缀的方法时你可以提供一个Executor作为可选参数来指定异步操作应在哪个线程上执行。如果未提供则使用ForkJoinPool.commonPool()。 5.3. 流式连接核心函数代码示例 1. thenApply / thenAccept / thenRun 这组函数主要用于连接前后有依赖的任务链。这里将thenApply / thenAccept / thenRun放在一起讲因为这几个连接函数之间的唯一区别是提交的任务类型不一样。 区别如下 1.thenApply提交的任务类型需遵从Function签名也就是有入参和返回值其中入参为前置任务的结果。 2.thenAccept提交的任务类型需遵从Consumer签名也就是有入参但是没有返回值其中入参为前置任务的结果。 3.thenRun提交的任务类型需遵从Runnable签名即没有入参也没有返回值。 代码示例 CompletableFutureInteger future1 CompletableFuture.supplyAsync(()-{System.out.println(compute 1);return 1; });CompletableFutureInteger future2 future1.thenApply((p)-{System.out.println(compute 2);return p10; }); System.out.println(result: future2.join());注意的是通过thenApply / thenAccept / thenRun连接的任务当且仅当前置任务计算完成时才会开始后置任务的计算。 应用场景总结 1. thenApply当需要在异步操作的结果上执行额外的计算或转换时使用 thenApply。 2. thenAccept当只需要消费异步操作的结果而不关心新的结果或执行额外的任务时使用 thenAccept。 3. thenRun当需要在异步操作完成后执行一个不依赖于其结果的任务时使用 thenRun。 2. thenCombine thenCombine最大的不同是连接任务可以是一个独立的CompletableFuture从而允许前后连接的两个任务可以并行执行后置任务不需要等待前置任务执行完成最后当两个任务均完成时再将其结果同时传递给下游处理任务从而得到最终结果 代码示例   假设我们有两个异步任务一个用于获取用户的名字nameFuture另一个用于获取用户的年龄ageFuture。我们希望当这两个任务都完成后将它们的结果组合成一个字符串如 “Name: John, Age: 30”。 CompletableFutureString nameFuture CompletableFuture.supplyAsync(() - getUserName()); CompletableFutureInteger ageFuture CompletableFuture.supplyAsync(() - getUserAge()); CompletableFutureString combinedFuture nameFuture.thenCombine(ageFuture, (name, age) - Name: name , Age: age ); combinedFuture.thenAccept(System.out::println); // 输出类似 Name: John, Age: 30thenAcceptBoth、thenAcceptBothAsync、runAfterBoth、runAfterBothAsync的作用与thenConbime类似区别如下 1. thenAcceptBoth 和 thenAcceptBothAsync 用于处理两个异步操作的结果但不返回新的结果。 2. runAfterBoth 和 runAfterBothAsync 也用于处理两个异步操作的完成但不关注它们的结果。 3. thenCombine 用于处理两个异步操作的结果并返回一个新的结果。 3. thenCompose thenCompose 的应用场景主要涉及到需要基于一个异步任务的结果来发起另一个异步任务的情况。它允许你将多个异步操作链接在一起并以前一个操作的结果作为后一个操作的输入。 代码示例 如果使用thenApply实现如下CompletableFutureInteger future1 CompletableFuture.supplyAsync(()-{System.out.println(compute 1);return 1; }); CompletableFutureCompletableFutureInteger future2 future1.thenApply((r)-CompletableFuture.supplyAsync(()-r10)); System.out.println(future2.join().join());当连接的任务越多时代码会变得越来越复杂嵌套获取层级也越来越深。使用thenCompose CompletableFutureInteger future1 CompletableFuture.supplyAsync(()-{System.out.println(compute 1);return 1; }); CompletableFutureInteger future2 future1.thenCompose((r)-CompletableFuture.supplyAsync(()-r10)); System.out.println(future2.join());4. whenComplete whenComplete主要用于注入任务完成时的回调通知逻辑。这个解决了传统future在任务完成时无法主动发起通知的问题。前置任务会将计算结果或者抛出的异常作为入参传递给回调通知函数。 代码示例 CompletableFutureString future CompletableFuture.supplyAsync(() - { // 模拟从数据库读取数据的异步操作 return Data from database; }); future.whenComplete((result, exception) - { if (exception null) { // 操作成功记录成功日志 System.out.println(Operation succeeded. Result: result); } else { // 操作失败记录异常日志 System.err.println(Operation failed with exception: exception.getMessage()); } // 在这里还可以执行其他与结果无关的操作如清理资源、发送通知等 });5. handle handle与whenComplete的作用有些类似但是handle接收的处理函数有返回值而且返回值会影响最终获取的计算结果。 代码示例 CompletableFutureInteger future1 CompletableFuture.supplyAsync(()-{System.out.println(compute 1);return 1; });CompletableFutureInteger future2 future1.handle((r, e)-{if(e ! null){System.out.println(compute failed!);return r;} else {System.out.println(received result is r);return r 10;} });System.out.println(result: future2.join());六、CompletableFuture中获取异步任务结果介绍 异步任务执行完成之后需要获取结果有如下一些方法 1. allOf 方法用于等待多个 CompletableFuture 任务全部完成。它接受一个 CompletableFuture 数组或列表作为参数并返回一个新的 CompletableFuture。这个新的 CompletableFuture 会在所有给定的 CompletableFuture 都完成时完成但它不包含任何原始任务的结果。 2. anyOf 方法与 allOf 类似但它只等待给定的 CompletableFuture 中的一个完成。它同样接受一个 CompletableFuture 数组或列表作为参数并返回一个新的 CompletableFuture。这个新的 CompletableFuture 会在任何一个给定的 CompletableFuture 完成时完成但它不包含任何原始任务的结果。 3. join 方法用于等待 CompletableFuture 完成并返回其结果如果可用。如果 CompletableFuture 尚未完成则 join 会阻塞当前线程直到它完成。如果 CompletableFuture 异常完成则 join 会抛出与异常完成相对应的异常。 4. get 方法与 join 类似也用于等待 CompletableFuture 完成并返回其结果。但是get 方法可以接收一个可选的超时参数和一个时间单位以便在指定的时间内等待 CompletableFuture 完成。如果 CompletableFuture 在指定的时间内没有完成则 get 方法会抛出 TimeoutException。另外如果 CompletableFuture 异常完成则 get 方法会抛出 ExecutionException包装了原始异常或 InterruptedException如果当前线程在等待时被中断。 以上就是对CompletableFuture的一些详细介绍以及一些常用api的代码示例希望对你在项目进行性能方面的代码优化中有一定的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/92345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旅游网站建设的相关报价昌平企业网站建设

这道题卡了挺久的QAQ现在才搞定 Description   金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置&#x…

云南 网站建设网站浏阳建设局网站

这是头哥侃码的第244篇原创有人说,人生就是一个不断尝试的过程。我觉得,有时候这个词其实不准确,因为每个人的性格不同,成长经历及运势不同,所以对 “尝试” 俩字的理解也就不同。在我还是孩子的时候,几乎所…

网站开发目录规范网站建设需求模板

java 和javafx我最喜欢的JavaFX 2功能之一是它在javafx.scene.chart包中提供的标准图表。 该软件包提供了几种不同类型的现成图表。 除其中之一( PieChart )外,所有其他均为“ 2轴图”( XYChart的特定实现)。 在本文中…

网站首页做一点开有动画视频生成链接在线工具

您好,欢迎来到新研之家 文章关键词:AF647 二苯并环辛炔,AF647 DBCO,Alexa Fluor 647 DBCO,AF647-二苯并环辛炔,AF647-DBCO 一、基本信息 产品简介:Alexa Fluor 647是一种独特的远红色染料&am…

360网站建设价格建筑电气与智能化

一、什么是爬虫? 爬虫是网络爬虫的简称,指的是一种自动化程序,用于在互联网上抓取信息。爬虫的核心工作包括爬取网页、解析数据和存储数据。 通俗来说就是:通过一个程序,根据url(http://taobao.com)进行爬取网页&…

做平面设计买哪个素材网站会员简单动画制作

上世纪九十年代,Internet快速发展催生了大量在线网站,Web访问量迅速提升。在互联网泡沫破灭前,这个领域基本是围绕如何对Web网站进行负载均衡与优化。从1997年F5发布了BIG-IP,到快速地形成完整ADC产品线,企业级负载均衡…

怎样可以查看网站是由哪个公司做的网站调用字体库

(本文为简单介绍,个人观点仅供参考) 嵌入式系统是建立在微处理器基础上的计算机系统,用于对专门的功能进行控制、运算和接口。它结合了硬件和软件,可以提供实时的响应,广泛应用于工业控制、通信、医疗、交通等领域。 嵌入式系统的核心是微处理…

招标网站排名前十名邵阳住建部网站

虽然现在网盘非常普及,但是对于一些重要文件的同步,很多朋友仍然在使用U盘进行同步。常规的方法是在A电脑将文件复制到U盘,然后在B电脑插入U盘,再将需要同步的文件复制到B电脑。这种操作不仅效率低,而且容易漏掉文件。…

seo网站培训凡客诚品的支付方式

Mozilla Firefox 起源于开源运动兴起之初建立的一个项目组织——Mozilla 社区,可以说是最早以“开源”名义出现,并取得成功的项目之一。Firefox 首次发行是在2002年的9月23日,当时的代号为“Phoenix”(凤凰)。18年过去…

上传网站数据库吗淘宝短网址生成

纯JDBC系统的开发随想前两天,两个个纯后台应用项目在没有充分论证的情况下使用了SpringiBatis实现,从需求到实现、测试历经两天时间,实际代码开发时间是8小时,时间比较短,因为有以前的代码积累。再加上对框架熟烂于心&…

怎么做北京pk10的网站wordpress api key

桌面功能介绍: 1:支持本地音乐、三方音乐控制播放展示功能; 2:支持陀螺仪 3:支持蓝牙列表显示。

网站建设与设计建筑工程信息价哪里可以查询

什么是多线程? 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹…

一个wordpress模版几个网站一级a做爰片免费网站孕交视频

本文基于移动端动态化方案在知乎原生推广落地页「知乎画报」上的实践经验,对该方案技术升级过程中的思考以及技术关键细节做了详尽的解读。商业化是互联网公司发展的重要阶段,App 端的商业广告业务对移动端动态化能力的需求很强烈,一方面需要…

鞍山创网站怎么创必应搜索引擎地址

首先在sql中查询计划事件的状态:SHOW VARIABLES LIKE event_scheduler如果返回的是off表示当前是关闭状态,如果是on当前已经开启了计划任务。在mysql程序的目录下找到my.ini文件,添加一个项:event_scheduler 1保存后重启mysql服务…

导航网页wordpress+优化速度

[基础知识点] 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树; 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法 [学习技巧] 学习它的“来历”“…

沧州做网站的游戏网站搭建需要多少钱

8086有如下3条一般移位指令 SAR OPRD,M ;算术右移 对无符号数和有符号数而言右移1位相当于原数除以2 SHR OPRD,M ;逻辑右移 对无符号数右移1位相当于原数除以2 SHL OPRD,M/SAL OPRD,M ;逻辑/算术左移(两个助记符只有一个机器指令,进行相同的动作)左移1位相当于原数*2

音乐网站 源码网站ui设计基础

集合类型 (Set) 是一个无序并唯一的键值集合。它的存储顺序不会按照插入的先后顺序进行存储。 集合类型和列表类型的区别如下: 列表可以存储重复元素,集合只能存储非重复元素;列表是按照元素的先后顺序存储元素的,而集合则是无序方式存储元素的。一、集合对象概述 特点:集…

金色财经网站开发外贸网站建设步骤

编者按:1991年微软研究院成立,三十年坚持不懈的探索成就了微软研究院今天在全球计算机科研领域的位置。在接下来的10年、30年中,科研世界会呈现何种面貌?下一个技术创新的突破点在哪里?微软又将怎样持续发挥作用&#…

网站域名怎么购买小程序开发网站

C进阶专栏:http://t.csdnimg.cn/HGkeZ 目录 1.前言 2.std::is_invocable_v 3.std::jthread 3.1.构造函数 3.2.std::jthread无需join/detach使用实例 3.3.std::jthread处理外部请求中断实 3.4.处理中断请求示例代码 4.特性 5.总结 1.前言 C11以来提供了C原…

网站建设 开发网站代码亚马逊网站建设

关于时区的概念,其实初中地理课已经涉及,很多人都多少了解一些,可能只是细节搞不太清楚。为什么会将地球分为不同时区呢?因为地球总是自西向东自转,东边总比西边先看到太阳,东边的时间也总比西边的早。东边…