面试官:SpringBoot项目中,要如何1秒实现异步接口?

今年IT寒冬,大厂都裁员或者准备裁员,作为开猿节流主要目标之一,我们更应该时刻保持竞争力。为了抱团取暖,林老师开通了《知识星球》,并邀请我阿里、快手、腾讯等的朋友加入,分享八股文、项目经验、管理经验等,帮助大家提升技能,安稳度过这个寒冬,快扫描(长按)加入我们吧!

异步任务是什么

想象一下,你在一家餐厅吃饭,服务员每次只接待一个顾客,直到他们的整个点单吃饭结账过程结束,服务员才会鞠躬回应下一位在队列中等待的顾客。这显然很疯狂,对吗? 在软件世界里,我们称这种方式为同步处理。如果服务员是我们的服务器,那么每次只能处理一个请求,效率低下不说,其他顾客(用户)也会因为长时间等待而感到不快。

进入异步接口,就像是把这家餐厅升级成了一个快速自助餐厅,其中的服务员(服务器线程/资源)可以同时接待多个顾客,每个顾客点单后可以自由活动,当美味的佳肴准备好了,服务员会召唤他们。这样做有以下几个理由:

  1. 提高吞吐量:通过异步接口,服务器可以同时处理多个请求,而不是一次一个,这大大提高了处理请求的能力。
  2. 更好的资源利用:异步编程意味着线程不会在等待(例如,等待一个I/O操作完成)时闲置,它们可以用来处理其他任务。
  3. 改善用户体验:对于客户端应用来说,异步调用可以避免用户界面在等待服务器响应时冻结,能够保持响应灵敏,提供更流畅的用户体验。
  4. 可伸缩性:由于服务器线程不会被长时间占用等待,你可以扩展应用处理更多请求而不必增加额外硬件资源。
  5. 减少等待时间:你可以并行发出多个异步请求,而不是顺序执行,这样可以减少整体的等待时间。

简单地说,异步接口就像是软件世界的多任务高效处理。它让用户可以不必在咖啡冷却前等待那台古老打印机完成工作。异步编程是一款时尚的超能工具腰带,在我们的代码战斗中,它让一个任务挂起而你去攻击另一个,直到全部敌人(任务)被消灭(完成)。

异步接口实现的几种方式

首先,搞定异步接口就像是制作一杯完美的咖啡。你需要正确的豆子和工具,就像在Java中你要选择合适的库和框架。

使用CompletableFuture

我们可以使用CompletableFuture,这个类是Java 8引入的,它就像是一个承诺(Promise)——在未来某个时刻会交付结果的那种。我们可以用它来以声明性的方式编写异步的代码。

// 这就像是告诉你的朋友,我会为你买咖啡,但不是现在,稍后给你。
CompletableFuture<String> futureCoffee = CompletableFuture.supplyAsync(() -> {// 在这里进行异步操作,比如调用一个异步接口或进行耗时计算。return makeCoffee();
});// 然后你可以继续做其他事情,咖啡准备好了会通知你。
futureCoffee.thenAccept(coffee -> {System.out.println("Enjoy your coffee: " + coffee);
});// 哦,对了,如果制作咖啡过程中出现了问题(抛出异常),我们也可以处理它。
futureCoffee.exceptionally(throwable -> {// handle exception herereturn "Default Coffee";
});

使用Spring的@Async

如果你是一个Spring框架的粉丝,异步编程就像拿起了Spring的“魔杖”。你只需要在一个方法上加上@Async注解,Spring就会在调用这个方法时,自动在一个单独的线程上运行它。

@Servicepublic class CoffeeService {
@Asyncpublic CompletableFuture<String> prepareCoffeeAsync() {return CompletableFuture.completedFuture(makeCoffee());}public String makeCoffee() {// 咖啡制作过程return "Espresso";}
}

使用Future

在老一些的Java版本,我们使用Future接口和ExecutorService来管理异步任务。这就像是一个更传统的方法,一步一步地完成任务并跟踪它们的状态。

ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<String> futureCoffee = executorService.submit(() -> {// 同样这里执行异步操作:制作咖啡return makeCoffee();
});try {// 在主线程中,你可以选择等待咖啡String coffee = futureCoffee.get();System.out.println("Enjoy your coffee: " + coffee);
} catch (InterruptedException | ExecutionException e) {e.printStackTrace();
}// 可别忘了关闭ExecutorService,否则它会保持活动状态。
executorService.shutdown();

在实现异步接口的过程中,就像是在为我们的代码穿上一副飞行装备。不仅能够使我们更加高效,还可以让用户体验爽到飞起!

不论使用哪种方式,关键在于明智的选择来适应你的应用场景。选择合适的异步实现方法,就像是在世界各地的咖啡豆中挑选出最对胃口的那一款,每一种都有其独特的风味。

CompletableFuture vs @Async vs Future

CompletableFuture

优点

  • 功能强大:它比较灵活,提供了异常处理、组合、转换等众多异步编程必需的功能。
  • 易于使用且易于读写:它的链式调用让代码看起来既简洁又优雅,对于维护者来说阅读起来是一种享受。
  • 集成简单:在Java 8及以后的版本无需额外集成其他库。

缺点

  • 性能开销:比起简单的Future来说,CompletableFuture是一个更重的抽象。
  • 学习曲线:由于它功能丰富,初学者可能需要时间来掌握它所有的API。

@Async in Spring

优点

  • 超级简单:只需要一个注解,你的方法就能异步运行了。
  • 容易理解:没有复杂的线程管理或者任务执行代码,Spring幕后帮你处理了这一切。

缺点

  • Spring依赖:这是一个Spring框架的特性,所以必须在Spring环境下使用。
  • 定制性较低:虽然适用于大部分场景,但如果你有非常特殊的异步需求,可能需要更细粒度的控制。

Future

优点

  • 简单直接:Future接口是Java标准库的一部分,因此非常基础和直观。
  • 广泛使用:在Java较早的版本中此方式被广泛使用,所以有很多资料和心得分享。

缺点

  • 局限性:没有提供像CompletableFuture那样的链式调用和转换方法。
  • 管理复杂:需要手动创建ExecutorService,管理线程池,以及在使用完毕后关闭线程池。
  • 阻塞性质:传统的Future.get()是阻塞的,直至操作完成,不够灵活。

小结一下,就好像我们在早餐店里挑选食物一样,每种食物(异步方法)都有其特色与适应的场景:

  • CompletableFuture 是一杯制作工艺复杂、口感层次丰富的拿铁咖啡。
  • Spring的@Async 就像是快速便利的现磨咖啡机,一键启动。
  • Future 则是传统的手磨咖啡,过程繁琐但稳定可靠。

挑选适当的方案,就是技术人抓住用户心的秘诀之一。就像在画布上作画,选择合适的工具和色彩,才能绘制出满意的作品。

《林老师带你学编程》知识星球,创始人由工作 10年以上的一线大厂人员组成,希望通过我们的分享,帮助大家少走弯路,可以在技术领域不断突破和发展。

具体的加入方式

  • 直接访问链接:https://t.zsxq.com/14F2uGap7
  • “长按”或“扫描”下方二维码噢

星球内容涵盖:Java技术栈、Python、大数据、项目实战、面试指导等主题。

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

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

相关文章

STM32逆变器方案

输入电压&#xff1a; 额定输入电压&#xff1a;DC110V 输入电压范围&#xff1a;DC77-137.5V 额定输出参数 电压&#xff1a;200V5%&#xff08;200VAC~240VAC 可调&#xff09; 频率&#xff1a; 42Hz0.5Hz&#xff08;35-50 可调&#xff09; 额定输出容量&#xff1a;1…

关于“Python”的核心知识点整理大全45

目录 15.4.6 绘制直方图 die_visual.py 注意 15.4.7 同时掷两个骰子 dice_visual.py 15.4.8 同时掷两个面数不同的骰子 different_dice.py 15.5 小结 第 16 章 16.1 CSV 文件格式 16.1.1 分析 CSV 文件头 highs_lows.py 注意 16.1.2 打印文件头及其位置 highs_l…

适合穷人创业项目低成本生意,2024热门创业项目

回收生意&#xff0c;一个月赚20万&#xff1f;别不信&#xff01; 我们两个人靠回收倒闭的酒店和KTV的店内物品&#xff0c;一个月赚了20多万。大件就是家具家电、厨房设备、点唱机&#xff0c;小件就是床品、餐具&#xff0c;只要能卖钱的都收。 卖给谁呢&#xff1f;大部分…

office bookmarks

Word2007Util.java-CSDN博客

webstorm中直接运行ts(TypeScript)

参考&#xff1a;https://www.cnblogs.com/yangfanjie/p/12036118.html 1&#xff1a;安装ts: npm install -g typescript 2&#xff1a;安装直接运行所需依赖包&#xff1a; npm install -g ts-node 3&#xff1a;在设置中安装安装插件后重启 4&#xff1a;重启后就会发现在…

Solana 生态铭文跨链桥 Sobit 是何神圣?其场外白名单已达到1200U

在短暂的沉寂&#xff0c;在与 Solana 手机 Saga 联合生态 Meme 币 Bonk 掀起一波 meme 浪潮&#xff0c;以及GPU 计算网路Render network 宣布将从公链Polygon迁往Solana 后&#xff0c;Solana 生态再次迎来爆发。随着 SOL 代币在 12 月暴涨&#xff0c;SOL 也在市值上超越了 …

前端进度条和进度条流光效果

前言 进度条的实现学习这个的,这里只是记录下自己笔记 https://bytefish.medium.com/css-awesome-trick-how-to-create-a-progress-bar-that-changes-color-according-to-progress-be9652ebdd1c 在线演示地址(原作者) https://codepen.io/bytefishmedium/pen/VwXYKQK 在线演示…

opencv和gdal的读写图片波段顺序问题

最近处理遥感影像总是不时听到 图片的波段错了&#xff0c;一开始不明就里&#xff0c;都是图片怎么就判断错了。 1、图像RGB波段顺序判断 后面和大家交流&#xff0c;基本上知道了一个判断标准。 一般来说&#xff0c;进入人眼的自然画面在计算机视觉中一般是rgb波段顺序表示…

Linux账号和权限管理

目录 前言 一、管理用户账号 1、Linux系统中用户账号类型 2、用户标识UID的分类 3、用户账号文件 4、用户账号的初始配置文件 5、用户账号的管理命令 5.1 useradd 5.2 usermod 5.3 passwd 5.4 userdel 二、管理组账号 1、Linux系统中组账号类型 2、组标识号GID的…

drf知识--07

回顾之视图层 # 两个视图基类&#xff1a; from rest_framework.views import APIView&#xff1a; 包装新的request、去除csrf认证、执行三大认证和处理全局异常 -as_view -dispatch -parser_class -render_class from rest_framewo…

5.8 Linux 服务实战

一、项目概述 项目名称&#xff1a;web 网站 项目时间&#xff1a;2022.7.18-2022.7.24 项目需求&#xff1a; ① 客户端使用kickstart部署4台虚拟机(centos7.9)&#xff0c;所有服务器IP都为静态IP。② 客户端使用XShell的密钥登陆跳板机③ 所有后端服务器全部通过跳板机来…

Shell命令与Linux操作系统:深入理解其原理和功能(2/2)

在当今数字化时代&#xff0c;操作系统的安全性和稳定性对于个人用户和企业都至关重要。Linux&#xff0c;作为一个广泛使用的操作系统&#xff0c;其强大的文件权限系统是保护系统安全的核心机制之一。无论是在服务器管理、软件开发还是日常使用中&#xff0c;有效地管理和理解…

MongoDB文档操作

3.3 文档操作 3.1 文档介绍 文档的数据结构和 JSON 基本一样。 所有存储在集合中的数据都是 BSON 格式。 BSON 是一种类似 JSON 的二进制形式的存储格式&#xff0c;是 Binary JSON 的简称。 文档是一组键值(key-value)对(即 BSON)&#xff0c;一个简单的文档例子如下&…

输入日期,计算当前日期是这一年中的第几天(涉及闰年问题)

一、应用到的知识&#xff1a;闰年问题&#xff0c;数组&#xff0c;for循环&#xff0c;命令行参数&#xff0c;atoi函数 1. 闰年问题&#xff1a; 闰年 是指该年有366日&#xff0c;即较平常年份多出一日。每400年就会有一次闰年&#xff1b;或者年份是4的倍数&#xff0c;但…

Flowable-升级为7.0.0.M2-第二节

目录 替换变化的类和配置把javax.servlet 替换为 jakarta.servlet修改redis的配置配置logging.level.org.springframework.boot.autoconfigureerror避免影响视听 替换变化的类和配置 把javax.servlet 替换为 jakarta.servlet import javax.servlet.ServletContext; import ja…

【Linux基础】9. 用户管理

文章目录 【 1. 用户基本管理 】1.1 useradd 添加用户1.2 passwd 更改用户密码1.3 su 切换用户1.4 userdel 删除用户 【 2. 用户的组 】2.1 more 查看系统所有组2.2 显示用户的组2.3 更改用户的组 【 3. 环境变量 】 【 1. 用户基本管理 】 1.1 useradd 添加用户 全称作用use…

【教程】使用ipagurd打包与混淆Cocos2d-x的Lua脚本

文章目录 摘要引言正文1. 准备工作2. 使用ipaguard处理Lua文件3. 运行ipagurd进行混淆代码加密具体步骤测试和配置阶段IPA 重签名操作步骤4. IPA重签名与发布 总结 摘要 本文将介绍如何使用ipagurd工具对Cocos2d-x中的Lua脚本进行打包与混淆&#xff0c;以及在iOS应用开发中的…

tekton 发布 kubernetes 应用

tekton 发布 kubernetes 应用 基于Kubernetes 服务部署 Tekton Pipeline 实例&#xff0c;部署完成后使用tekton来完成源码拉取、应用打包、镜像推送和应用部署。 本文实现一个 golang-helloworld 项目 CI/CD 的完整流程&#xff0c;具体包括以下步骤&#xff1a; 从 gitee…

css 超过一行/多行显示省略号... - 附示例

效果 1、超过一行 2、超过多行 - 以两行为例 二、示例代码 1、超过一行 margin: 20px; width: 50px; border: 1px solid red; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; 2、超过多行 - 以两行为例 margin: 20px; width: 50px; border: 1px solid r…