【Netty篇】Future Promise 详解

news2025/5/25 21:49:43

在这里插入图片描述

目录

    • 一、 Netty Future 与 Promise —— 异步世界的“信使”与“传话筒”🚀
      • 1、 理解 Netty Future
      • 2、 理解 Netty Promise
    • 二、 代码案例解读💻
      • 例1:同步处理任务成功👍
      • 例2:异步处理任务成功📲
      • 例3:同步处理任务失败(sync/get )❌
      • 例4:同步处理任务失败( await )❌
      • 例5:异步处理任务失败📵
      • 例6:await 死锁检查⚠️
    • 三、 总结✨

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!

🌟了解 Java的 NIO 请看 : NIO,看完你就懂了!

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning

下面让我带着你进入 Netty 异步世界的奇妙乐园,用幽默风趣的语言详细讲解一下 Netty 的 Future 和 Promise 在整个异步处理中的“神圣角色”。


一、 Netty Future 与 Promise —— 异步世界的“信使”与“传话筒”🚀

了解Netty请看:【Netty篇】幽默的讲解带你入门 Netty !建议收藏

1、 理解 Netty Future

在 Java 的异步世界中,JDK 提供了 Future 接口,用来表示某个异步任务在未来会返回一个结果。然而,Netty 的 Future 可不是普通的“邮差”,它继承了 JDK Future 的功能,并增加了更多炫酷的异步操作功能。对比来看,JDK 的 Future 就像是一个只能被动等待包裹送达的普通快递📦,而 Netty 的 Future 则相当于可以主动接收短信通知📱、还可以添加回调函数,随时告诉你“包裹已妥投”或者“出错啦”的智能快递员!

Netty Future 的主要特点:

  • 非阻塞查看结果:通过 getNow() 方法,你可以在不等待结果的情况下查看当前任务是否已经有了结果(还没到货时返回 null)。
  • 同步等待与异步回调:支持通过 await()sync() 方法来同步等待任务完成;同时还支持添加监听器 addListener(),以便任务一完成就触发回调通知你任务成功还是失败。
  • 判断状态:有 isSuccess()cause() 方法,前者判断任务是否顺利完成,后者获取失败的原因。

简单说,Netty Future 就是那个既可以告诉你“嗯,任务完成啦”,又可以让你“不用天天刷快递状态”的智能信使。😉

2、 理解 Netty Promise

Promise 则是在 Netty Future 的基础上进一步增强的角色。它不仅继承了 Netty Future 的所有技能,还扮演了一个“任务结果容器”的角色 —— 专门用来在不同线程间传递结果。可以把 Promise 想象成一个纸箱📦,你可以把处理结果(无论是成功的小礼物🎁还是失败的挫败感😓)封装进去,然后交给异步任务的“快递员”去传递给等待的那一方。

Promise 的独有能力:

  • 设置结果:通过 setSuccess()setFailure() 方法来主动设置操作的成功或失败结果,就像你在邮寄包裹时在包裹上标注“送达啦”或“出错啦”。
  • 脱离任务独立存在:它不强绑定在一个真实任务上,而是单纯作为信息传递的容器,方便两个线程之间进行沟通。

使用 Netty Promise 时,你完全可以自如地控制结果的传递,这就使得异步处理不再是“看天吃饭”,而像是有了明确的预报系统!🔮


二、 代码案例解读💻

让我们来看几个文件中提供的代码示例,看看 Netty Future 和 Promise 怎么在实际运作中“发威”的!

了解EventLoop请看:【Netty篇】EventLoopGroup 与 EventLoop 详解

例1:同步处理任务成功👍

在这个例子中,我们通过 DefaultPromise 提交了一个异步任务,该任务经过 1 秒后将结果 10 设置为成功,并分别调用 getNow()(非阻塞获取结果)和 get()(阻塞获取结果)。

DefaultEventLoop eventExecutors = new DefaultEventLoop();
DefaultPromise<Integer> promise = new DefaultPromise<>(eventExecutors);

eventExecutors.execute(() -> {
    try {
        Thread.sleep(1000);    //休眠 1 秒
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    log.debug("set success, {}", 10);
    promise.setSuccess(10);
});

log.debug("start...");
log.debug("{}", promise.getNow()); // 此时还未产生结果,输出 null
log.debug("{}", promise.get());

输出结果

在这里插入图片描述

幽默点评:
就好比你下单了快递,一开始查快递状态发现还是“快递未到(null)”,1 秒后短信一来,“包裹 10 已送达”,你终于能开心地签收啦!🎉

例2:异步处理任务成功📲

此示例演示了如何通过 addListener() 添加一个异步回调,让你不用一直守着电脑,任务一完成,立刻收到通知。

DefaultEventLoop eventExecutors = new DefaultEventLoop();
DefaultPromise<Integer> promise = new DefaultPromise<>(eventExecutors);

// 注册回调监听器,当任务完成时异步通知
promise.addListener(future -> {
    log.debug("{}", future.getNow());
});

// 1 秒后设置成功结果
eventExecutors.execute(() -> {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    log.debug("set success, {}", 10);
    promise.setSuccess(10);
});

log.debug("start...");

输出结果

在这里插入图片描述

幽默点评:
你注册了短信通知,1 秒后快递送到,你的手机立刻震动:“包裹 10 到达啦!”你再也不用时不时刷新查询界面啦。😎

例3:同步处理任务失败(sync/get )❌

通过 get()sync() 获取结果时,若任务失败会抛出异常(就像快递因地址错误而无法送达,结果直接抛出异常包裹)。

DefaultEventLoop eventExecutors = new DefaultEventLoop();
DefaultPromise<Integer> promise = new DefaultPromise<>(eventExecutors);

eventExecutors.execute(() -> {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    RuntimeException e = new RuntimeException("error...");
    log.debug("set failure, {}", e.toString());
    promise.setFailure(e);
});

log.debug("start...");
log.debug("{}", promise.getNow());
promise.get();  // sync() 同样会将异常抛出

输出结果

在这里插入图片描述
幽默点评:
就像你急着签快递,结果包裹因为地址错误直接让你崩溃,异常也随之抛出

例4:同步处理任务失败( await )❌

采用 await() 方法等待任务完成,但不会抛出异常,你需要主动判断成功还是失败,通过 isSuccess() 判断并获取错误原因。

DefaultEventLoop eventExecutors = new DefaultEventLoop();
DefaultPromise<Integer> promise = new DefaultPromise<>(eventExecutors);

eventExecutors.execute(() -> {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    RuntimeException e = new RuntimeException("error...");
    log.debug("set failure, {}", e.toString());
    promise.setFailure(e);
});

log.debug("start...");
log.debug("{}", promise.getNow());
promise.await();  // 等待任务完成但不抛出异常
log.debug("result {}", (promise.isSuccess() ? promise.getNow() : promise.cause()).toString());

输出结果:

在这里插入图片描述

幽默点评:
这个例子使用 await 温柔不少,等待结束后你主动检查状态,发现“出错啦”,然后淡定地拿出纸笔记录问题。✍️

例5:异步处理任务失败📵

这段代码与例2类似,不过任务失败后通过添加监听器异步获取错误结果。

DefaultEventLoop eventExecutors = new DefaultEventLoop();
DefaultPromise<Integer> promise = new DefaultPromise<>(eventExecutors);

// 设置监听器,异步处理
promise.addListener(future -> {
    log.debug("result {}", (promise.isSuccess() ? promise.getNow() : promise.cause()).toString());
});

eventExecutors.execute(() -> {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    RuntimeException e = new RuntimeException("error...");
    log.debug("set failure, {}", e.toString());
    promise.setFailure(e);
});

log.debug("start...");

输出结果:

在这里插入图片描述

幽默点评:
这就像你设置了短信通知,当快递因故“送达失败”时,你立刻收到消息:“出问题啦:error…”,整个过程迅速而高效!📉

例6:await 死锁检查⚠️

这个例子特别有趣,它展示了在同一个线程中如果调用 await() 会触发死锁检查,抛出 BlockingOperationException

DefaultEventLoop eventExecutors = new DefaultEventLoop();
DefaultPromise<Integer> promise = new DefaultPromise<>(eventExecutors);

eventExecutors.submit(() -> {
    System.out.println("1");
    try {
        promise.await();
    } catch (Exception e) { 
        e.printStackTrace();
    }
    System.out.println("2");
});
eventExecutors.submit(() -> {
    System.out.println("3");
    try {
        promise.await();
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("4");
});

输出结果:

在这里插入图片描述

幽默点评:
这段代码就像在一个派对上,有人非要一直守着快递,结果被主持人发现这是在“自缠绕”,直接抛出异常告诉他:“别傻等啦,你自己等死吧!”😂 从侧面告诉你,await() 在某些情况下是不能乱用的,要小心死锁风险!


三、 总结✨

通过上述讲解和多个幽默的代码示例,我们可以看到:

  • Netty Future 为我们提供了既能同步等待又能异步回调的能力,让我们不用像 JDK 的 Future 那样对快递死盯一眼。
  • Promise 则在 Future 的基础上增加了主动设置任务结果的功能,充当了任务结果在不同线程间“传递包裹”的容器,无论是成功的小礼物还是失败的提示,都能及时传达!
  • 文件中的各个实例充分展示了如何处理任务成功与失败的不同场景,并且提醒我们要小心使用 await(),以免因死锁检查而被“暴击”!😅

希望这份充满趣味、表情丰富且详细的讲解能够帮助你深入理解 Netty 中 Future 与 Promise 的奥秘,在今后的异步开发中用得得心应手、畅快如风!🌬️

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

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

相关文章

视频分析设备平台EasyCVR安防视频管理系统,打造电石生产智能视频监控新体系

一、背景介绍 电石生产中的出炉工序是整个生产流程中最为繁重且危险的环节。在开堵炉眼的过程中&#xff0c;电石极易发生飞溅现象&#xff0c;尤其在进行吹氧操作时&#xff0c;人员灼伤的风险极高。鉴于此&#xff0c;该工序正逐步由传统的人工操作模式向智能化方向转变。然…

从 PyTorch 到 ONNX:深度学习模型导出全解析

在模型训练完毕后&#xff0c;我们通常希望将其部署到推理平台中&#xff0c;比如 TensorRT、ONNX Runtime 或移动端框架。而 ONNX&#xff08;Open Neural Network Exchange&#xff09;正是 PyTorch 与这些平台之间的桥梁。 本文将以一个图像去噪模型 SimpleDenoiser 为例&a…

Android 应用添加Tile到SystemUI QuickSettings

安卓源码里有谷歌给的关于 Tile 的说明。 frameworks/base/packages/SystemUI/docs/qs-tiles.md SystemUI QuickSettings 简称QS&#xff0c;指的是 下拉菜单里的区域。区域里的一个选项就是一个 Tile 。 下图是 frameworks/base/packages/SystemUI/docs/ 里的附图示例&#…

【MySQL】前缀索引、索引下推、访问方法,自适应哈希索引

最左前缀原则 对于INDEX(name, age)来说最左前缀可以是联合索引的最左N个字段, 也可以是字符串索引的最左M个字符。 SELECT * FROM t WHERE name LIKE 张%其效果和单独创建一个INDEX(name)的效果是一样的若通过调整索引字段的顺序, 可以少维护一个索引树, 那么这个顺序就是需要…

Android Studio开发知识:从基础到进阶

引言 Android开发作为移动应用开发的主流方向之一&#xff0c;曾吸引了无数开发者投身其中。然而&#xff0c;随着市场饱和和技术迭代&#xff0c;当前的Android开发就业形势并不乐观&#xff0c;竞争日益激烈。尽管如此&#xff0c;掌握扎实的开发技能仍然是脱颖而出的关键。本…

ocr-身份证正反面识别

在阿里云官网&#xff0c;申请一个token [阿里官方]身份证OCR文字识别_API专区_云市场-阿里云 (aliyun.com) 观察一下post请求body部分json字符串&#xff0c;我们根据这个创建一个java对象 先默认是人像面 public class IdentityBody {public String image;class configure…

单节锂电池4.2V升压5V都有哪些国产芯片推荐?国产SL4011高效,高性价比

针对单节锂电池&#xff08;4.2V&#xff09;升压至5V应用中 SL4011升压芯片 的核心优势解析&#xff0c;结合其技术参数与典型应用场景进行详细说明&#xff1a; 1. 宽输入电压与高兼容性 输入范围&#xff1a;2.7V-12V&#xff0c;完美覆盖单节锂电池全周期电压&#xff08;3…

机器学习 | 神经网络介绍 | 概念向

文章目录 &#x1f4da;从生物神经元到人工神经元&#x1f4da;神经网络初识&#x1f407;激活函数——让神经元“动起来”&#x1f407;权重与偏置——调整信息的重要性&#x1f407;训练神经网络——学习的过程&#x1f407;过拟合与正则化——避免“死记硬背” &#x1f440…

视频孪生重构施工逻辑:智慧工地的数字化升级

当"智慧工地"概念在2017年首次写入《建筑业发展"十三五"规划》时&#xff0c;行业普遍将其等同于摄像头与传感器的简单叠加。十年数字浪潮冲刷下&#xff0c;智慧工地的内涵已发生本质跃迁&#xff1a;从工具层面的信息化改造&#xff0c;进化为基于视频数…

六根觉性:穿透表象的清净觉知之光

在喧嚣的禅堂里&#xff0c;老禅师轻叩茶盏&#xff0c;清脆的声响划破沉寂。这声"叮"不仅震动耳膜&#xff0c;更叩击着修行者的心性——这正是佛教揭示的六根觉性在世间万相中的妙用。当我们凝视《楞严经》中二十五圆通法门&#xff0c;六根觉性犹如六道澄明之光&a…

spring:注解@Component、@Controller、@Service、@Reponsitory

背景 spring框架的一个核心功能是IOC&#xff0c;就是将Bean初始化加载到容器中&#xff0c;Bean是如何加载到容器的&#xff0c;可以使用spring注解方式或者spring XML配置方式。 spring注解方式直接对项目中的类进行注解&#xff0c;减少了配置文件内容&#xff0c;更加便于…

Halcon应用:九点标定-手眼标定

提示&#xff1a;若没有查找的算子&#xff0c;可以评论区留言&#xff0c;会尽快更新 Halcon应用&#xff1a;九点标定-手眼标定 前言一、Halcon应用&#xff1f;二、应用实战1、图形理解[eye-to-hand]&#xff1a;1.1、开始应用2 图形理解[eye-in-hand] 前言 本篇博文主要用…

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(一)

自动引用计数 前言alloc/retain/release/dealloc实现苹果的实现 autoreleaseautorelease实现苹果的实现 总结 前言 此前&#xff0c;写过一遍对自动引用计数的简单学习&#xff0c;因此掠过其中相同的部分&#xff1a;引用计数初步学习 alloc/retain/release/dealloc实现 由于…

Python爬虫第15节-2025今日头条街拍美图抓取实战

目录 一、项目背景与概述 二、环境准备与工具配置 2.1 开发环境要求 2.2 辅助工具配置 三、详细抓取流程解析 3.1 页面加载机制分析 3.2 关键请求识别技巧 3.3 参数规律深度分析 四、爬虫代码实现 五、实现关键 六、法律与道德规范 一、项目概述 在当今互联网时代&a…

智慧城市像一张无形大网,如何紧密连接你我他?

智慧城市作为复杂巨系统&#xff0c;其核心在于通过技术创新构建无缝连接的网络&#xff0c;使物理空间与数字空间深度融合。这张"无形大网"由物联网感知层、城市数据中台、人工智能中枢、数字服务入口和安全信任机制五大支柱编织而成&#xff0c;正在重塑城市运行规…

网络安全·第四天·扫描工具Nmap的运用

今天我们要介绍网络安全中常用的一种扫描工具Nmap&#xff0c;它被设计用来快速扫描大型网络&#xff0c;主要功能包括主机探测、端口扫描以及版本检测&#xff0c;小编将在下文详细介绍Nmap相应的命令。 Nmap的下载安装地址为&#xff1a;Nmap: the Network Mapper - Free Se…

黑龙江 GPU 服务器租用:开启高效计算新征程

随着人工智能、深度学习、大数据分析等技术的广泛应用&#xff0c;对强大计算能力的需求日益迫切。GPU 服务器作为能够提供卓越并行计算能力的关键设备&#xff0c;在这一进程中发挥着至关重要的作用。对于黑龙江地区的企业、科研机构和开发者而言&#xff0c;选择合适的 GPU 服…

SparseDrive---论文阅读

纯视觉下的稀疏场景表示 算法动机&开创性思路 算法动机&#xff1a; 依赖于计算成本高昂的鸟瞰图&#xff08;BEV&#xff09;特征表示。预测和规划的设计过于直接&#xff0c;没有充分利用周围代理和自我车辆之间的高阶和双向交互。场景信息是在agent周围提取&#xff…

Unchained 内容全面上链,携手 Walrus 迈入去中心化媒体新时代

加密新闻媒体 Unchained — — 业内最受信赖的声音之一 — — 现已选择 Walrus 作为其去中心化存储解决方案&#xff0c;正式将其所有媒体内容&#xff08;文章、播客和视频&#xff09;上链存储。Walrus 将替代 Unchained 现有的中心化存储架构&#xff0c;接管其全部历史内容…

确保连接器后壳高性能互连的完整性

本文探讨了现代后壳技术如何促进高性能互连的电气和机械完整性&#xff0c;以及在规范阶段需要考虑的一些关键因素。 当今的航空航天、国防和医疗应用要求连接器能够提供高速和紧凑的互连&#xff0c;能够承受振动和冲击&#xff0c;并保持对电磁和射频干扰 &#xff08;EMI/R…