Netty源码分析篇:Netty 中的 Future、Promise

netty案例,netty4.1源码分析篇六《Netty异步架构监听类Promise源码分析》 分析Promise之前我们先来看两个单词;Promise、Future >Promise v. 许诺;承诺;答应;保证;使很可能;预示 Future n. 将来;未来;未来的事;将来发生的事;前景;前途;前程 他们的含义都是对未来即将要发生的事情做相应的处理,这也是在异步编程中非常常见的类名。 Netty是一个异步网络处理框架,在实现中大量使用了Future机制,并在Java自带Future的基础上,增加了Promise机制。这两个实现类的目的都是为了使异步编程更加方便使用。 阅读详情

深入浅出 Netty 中的 Future 与 Promise

前言

在学习 Netty 的过程中,你一定会遇到 Future 和 Promise 这两个概念。它们是 Netty 异步编程的核心,理解它们对掌握 Netty 至关重要。

本文将从 JDK 的 Future 开始,逐步引出 Netty 对 Future 的增强,最后介绍 Promise 的作用。通过对比和实例,让你彻底理解这三者的关系和使用场景。


一、从 JDK Future 说起

1. 什么是 Future?

想象一下这个场景:你去餐厅点餐,服务员给你一个取餐号码牌。这个号码牌就是 Future,它代表了一个"未来会完成的任务"。你可以拿着号码牌去做其他事情,等餐做好了再来取。

在 Java 中,Future 就是这样一个"号码牌",它代表一个异步任务的执行结果。

2. JDK Future 接口定义

package java.util.concurrent;

public interface Future<V> {
    // 取消任务执行
    boolean cancel(boolean mayInterruptIfRunning);
    
    // 任务是否已取消
    boolean isCancelled();
    
    // 任务是否已完成(正常完成、异常、取消都算完成)
    boolean isDone();
    
    // 阻塞获取任务执行结果(会一直等待,直到任务完成)
    V get() throws InterruptedException, ExecutionException;
    
    // 带超时的阻塞获取(最多等待指定时间)
    V get(long timeout, TimeUnit unit) 
        throws InterruptedException, ExecutionException, TimeoutException;
}

3. JDK Future 使用示例

ExecutorService executor = Executors.newSingleThreadExecutor();

// 提交一个异步任务
Future<String> future = executor.submit(() -> {
    Thread.sleep(2000); // 模拟耗时操作
    return "任务完成";
});

System.out.println("任务已提交,继续做其他事情...");

// 阻塞等待结果
String result = future.get(); // 这里会阻塞 2 秒
System.out.println("获取到结果:" + result);

4. JDK Future 的局限性

虽然 JDK 的 Future 提供了异步能力,但它有两个明显的问题:

问题 1:只能阻塞获取结果

回到餐厅的例子,JDK Future 就像你必须站在取餐口一直等着,不能离开。你调用 get() 方法时,当前线程会被阻塞,直到任务完成。

// 这行代码会阻塞当前线程,直到任务完成
String result = future.get(); 

问题 2:没有回调机制

如果餐厅能在餐做好时给你发个短信通知,你就不用一直等着了。但 JDK Future 没有这种"通知"机制,你必须主动去查询(调用 get())。

这就是为什么 Netty 要对 Future 进行增强!


二、Netty 对 Future 的增强

1. Netty Future 解决了什么问题?

Netty 继承了 JDK 的 Future 接口,并在此基础上做了大量增强。就像给餐厅的取餐系统升级了:

  • 增加了短信通知功能(回调机制)
  • 可以随时查看餐是否做好,不用一直等(非阻塞查询)
  • 可以知道餐做失败的原因(失败原因查询)

2. Netty Future 接口定义

package io.netty.util.concurrent;

public interface Future<V> extends java.util.concurrent.Future<V> {
    
    // ========== 状态查询(比 JDK 更详细)==========
    boolean isSuccess();           // 是否成功完成(区分成功和失败)
    boolean isCancellable();       // 是否可取消
    Throwable cause();             // 失败原因(如果失败了,可以知道为什么)
    
    // ========== 非阻塞获取(这是新增的!)==========
    V getNow();                    // 立即获取结果,不阻塞
                                   // 如果任务未完成,返回 null
    
    // ========== 阻塞等待(不抛异常)==========
    Future<V> await() throws InterruptedException;
    Future<V> awaitUninterruptibly();
    boolean await(long timeout, TimeUnit unit) throws InterruptedException;
    boolean await(long timeoutMillis) throws InterruptedException;
    
    // ========== 阻塞等待(抛异常)==========
    Future<V> sync() throws InterruptedException;      // 如果任务失败,会抛出异常
    Future<V> syncUninterruptibly();
    
    // ========== 监听器(回调机制,这是核心增强!)==========
    Future<V> addListener(GenericFutureListener<? extends Future<? super V>> listener);
    Future<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners);
    Future<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener);
    Future<V> removeListeners(GenericFutureListener<? extends Future<? super V>>... listeners);
    
    // ========== 取消操作 ==========
    @Override
    boolean cancel(boolean mayInterruptIfRunning);
}

3. Netty Future 的核心增强点

增强 1:回调机制(最重要!)

这是 Netty Future 最重要的增强。你可以添加监听器,任务完成后会自动通知你。

// Netty 客户端连接示例
ChannelFuture future = bootstrap.connect("localhost", 8080);

// 添加监听器,连接完成后自动回调
future.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture future) throws Exception {
        if (future.isSuccess()) {
            System.out.println("连接成功!");
        } else {
            System.out.println("连接失败:" + future.cause().getMessage());
        }
    }
});

// 主线程可以继续做其他事情,不用阻塞等待
System.out.println("连接请求已发出,继续执行其他任务...");

使用 Lambda 表达式更简洁:

future.addListener(f -> {
    if (f.isSuccess()) {
        System.out.println("连接成功!");
    } else {
        System.out.println("连接失败:" + f.cause().getMessage());
    }
});
增强 2:非阻塞获取结果
// 立即获取结果,不阻塞
Channel channel = future.getNow();

if (channel != null) {
    System.out.println("连接已完成");
} else {
    System.out.println("连接还未完成");
}
增强 3:更详细的状态查询
if (future.isDone()) {
    // 任务已完成(可能成功、失败或取消)
    
    if (future.isSuccess()) {
        // 成功完成
        System.out.println("任务成功");
    } else if (future.isCancelled()) {
        // 被取消
        System.out.println("任务被取消");
    } else {
        // 失败了
        System.out.println("任务失败:" + future.cause().getMessage());
    }
}
增强 4:await() vs sync()

这两个方法都是阻塞等待,但有区别:

// await():只等待任务完成,不管成功还是失败
future.await();
if (future.isSuccess()) {
    // 需要手动检查是否成功
}

// sync():等待任务完成,如果失败会抛出异常
try {
    future.sync(); // 如果连接失败,这里会抛异常
    System.out.println("连接成功");
} catch (Exception e) {
    System.out.println("连接失败:" + e.getMessage());
}

4. Netty Future 使用场景

在 Netty 中,几乎所有的异步操作都会返回 Future:

// 绑定端口
ChannelFuture bindFuture = serverBootstrap.bind(8080);

// 连接服务器
ChannelFuture connectFuture = bootstrap.connect("localhost", 8080);

// 写数据
ChannelFuture writeFuture = channel.writeAndFlush(msg);

// 关闭连接
ChannelFuture closeFuture = channel.close();

三、Promise:可写的 Future

1. 什么是 Promise?

如果说 Future 是"取餐号码牌",那么 Promise 就是"后厨的订单单"。

  • Future:只能读取结果,不能修改(顾客只能等待和查询)
  • Promise:既能读取结果,也能写入结果(后厨可以标记订单完成或失败)

在 Netty 中,Promise 继承自 Future,增加了设置结果的能力。

2. Promise 接口定义

package io.netty.util.concurrent;

public interface Promise<V> extends Future<V> {
    
    // ========== 设置成功结果 ==========
    Promise<V> setSuccess(V result);      // 设置成功,如果已经设置过会抛异常
    boolean trySuccess(V result);         // 尝试设置成功,如果已设置过返回 false
    
    // ========== 设置失败结果 ==========
    Promise<V> setFailure(Throwable cause);  // 设置失败,如果已经设置过会抛异常
    boolean tryFailure(Throwable cause);     // 尝试设置失败,如果已设置过返回 false
    
    // ========== 设置不可取消 ==========
    boolean setUncancellable();
    
    // ========== 继承自 Future 的方法(返回类型改为 Promise,支持链式调用)==========
    @Override
    Promise<V> addListener(GenericFutureListener<? extends Future<? super V>> listener);
    @Override
    Promise<V> await() throws InterruptedException;
    @Override
    Promise<V> sync() throws InterruptedException;
    // ... 其他方法
}

3. Promise 使用示例

示例 1:基本使用
// 创建一个 Promise
EventLoop eventLoop = new NioEventLoopGroup().next();
Promise<String> promise = eventLoop.newPromise();

// 添加监听器
promise.addListener(future -> {
    if (future.isSuccess()) {
        System.out.println("任务成功:" + future.getNow());
    } else {
        System.out.println("任务失败:" + future.cause().getMessage());
    }
});

// 在另一个线程中执行任务
new Thread(() -> {
    try {
        Thread.sleep(2000);
        // 设置成功结果
        promise.setSuccess("任务完成!");
    } catch (Exception e) {
        // 设置失败结果
        promise.setFailure(e);
    }
}).start();

System.out.println("任务已提交,继续执行...");
示例 2:try 方法的使用
Promise<String> promise = eventLoop.newPromise();

// trySuccess 不会抛异常
if (promise.trySuccess("第一次设置")) {
    System.out.println("设置成功");
}

// 再次尝试设置,会返回 false
if (!promise.trySuccess("第二次设置")) {
    System.out.println("已经设置过了,无法再次设置");
}

// 如果使用 setSuccess,第二次会抛异常
// promise.setSuccess("第二次设置"); // 会抛 IllegalStateException
示例 3:在 Netty 中的实际应用
public class MyHandler extends ChannelInboundHandlerAdapter {
    
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        // 创建一个 Promise
        Promise<String> promise = ctx.executor().newPromise();
        
        // 添加监听器
        promise.addListener(future -> {
            if (future.isSuccess()) {
                // 发送响应
                ctx.writeAndFlush(future.getNow());
            } else {
                // 关闭连接
                ctx.close();
            }
        });
        
        // 异步处理业务逻辑
        processAsync(promise);
    }
    
    private void processAsync(Promise<String> promise) {
        // 模拟异步业务处理
        new Thread(() -> {
            try {
                // 业务逻辑
                String result = doSomething();
                promise.setSuccess(result);
            } catch (Exception e) {
                promise.setFailure(e);
            }
        }).start();
    }
}

4. set vs try 方法的区别

方法行为使用场景
setSuccess(V)设置成功,如果已设置会抛异常确定只会设置一次的场景
trySuccess(V)尝试设置成功,如果已设置返回 false可能多次尝试设置的场景
setFailure(Throwable)设置失败,如果已设置会抛异常确定只会设置一次的场景
tryFailure(Throwable)尝试设置失败,如果已设置返回 false可能多次尝试设置的场景
// 使用 set 方法(确定只设置一次)
promise.setSuccess("结果");

// 使用 try 方法(可能多次尝试)
if (promise.trySuccess("结果")) {
    // 设置成功
} else {
    // 已经被其他线程设置过了
}

四、三者关系总结

1. 继承关系

java.util.concurrent.Future (JDK)
         ↑
         |
io.netty.util.concurrent.Future (Netty)
         ↑
         |
io.netty.util.concurrent.Promise (Netty)

2. 功能对比

特性JDK FutureNetty FutureNetty Promise
获取结果✅ get() 阻塞获取✅ get() 阻塞获取
✅ getNow() 非阻塞获取
✅ 同 Netty Future
状态查询✅ isDone()
✅ isCancelled()
✅ isDone()
✅ isCancelled()
✅ isSuccess()
✅ cause()
✅ 同 Netty Future
回调机制❌ 不支持✅ addListener()✅ 同 Netty Future
设置结果❌ 不支持❌ 不支持✅ setSuccess()
✅ setFailure()
✅ trySuccess()
✅ tryFailure()
阻塞等待✅ get()✅ await()
✅ sync()
✅ 同 Netty Future

3. 使用场景

JDK Future:

  • 简单的异步任务
  • 不需要回调机制
  • 使用 JDK 原生线程池
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> "结果");
String result = future.get(); // 阻塞获取

Netty Future:

  • Netty 框架中的异步操作(只读取结果)
  • 需要回调机制
  • 需要非阻塞查询
ChannelFuture future = bootstrap.connect("localhost", 8080);
future.addListener(f -> {
    if (f.isSuccess()) {
        System.out.println("连接成功");
    }
});

Netty Promise:

  • 需要手动设置异步任务的结果
  • 自定义异步操作
  • 需要在不同线程间传递结果
Promise<String> promise = eventLoop.newPromise();
promise.addListener(f -> System.out.println(f.getNow()));

// 在其他线程设置结果
new Thread(() -> promise.setSuccess("完成")).start();

4. 形象比喻总结

概念比喻角色能力
JDK Future取餐号码牌(基础版)顾客只能站在窗口等待取餐
Netty Future取餐号码牌(升级版)顾客可以留电话号码,做好了通知你
Netty Promise后厨订单单厨师可以标记订单完成或失败

五、实战建议

1. 什么时候使用 Future?

当你调用 Netty 的异步方法时,返回的就是 Future,你只需要:

// 场景 1:不关心结果,继续执行
bootstrap.connect("localhost", 8080);

// 场景 2:添加监听器处理结果
bootstrap.connect("localhost", 8080).addListener(future -> {
    // 处理连接结果
});

// 场景 3:阻塞等待结果
ChannelFuture future = bootstrap.connect("localhost", 8080);
future.sync(); // 等待连接完成

2. 什么时候使用 Promise?

当你需要自己实现异步操作时:

public Promise<String> asyncOperation(EventLoop eventLoop) {
    // 创建 Promise
    Promise<String> promise = eventLoop.newPromise();
    
    // 异步执行任务
    new Thread(() -> {
        try {
            // 执行业务逻辑
            String result = doSomething();
            // 设置成功结果
            promise.setSuccess(result);
        } catch (Exception e) {
            // 设置失败结果
            promise.setFailure(e);
        }
    }).start();
    
    // 立即返回 Promise
    return promise;
}

// 使用
asyncOperation(eventLoop).addListener(future -> {
    if (future.isSuccess()) {
        System.out.println("结果:" + future.getNow());
    }
});

3. 常见错误

错误 1:重复设置 Promise
Promise<String> promise = eventLoop.newPromise();
promise.setSuccess("第一次");
promise.setSuccess("第二次"); // ❌ 抛异常!

// 正确做法:使用 try 方法
if (!promise.trySuccess("第二次")) {
    System.out.println("已经设置过了");
}
错误 2:在 IO 线程中阻塞
// ❌ 错误:在 Netty 的 IO 线程中调用 sync() 或 await()
public void channelActive(ChannelHandlerContext ctx) {
    ChannelFuture future = ctx.writeAndFlush(msg);
    future.sync(); // 可能导致死锁!
}

// ✅ 正确:使用监听器
public void channelActive(ChannelHandlerContext ctx) {
    ctx.writeAndFlush(msg).addListener(future -> {
        if (future.isSuccess()) {
            // 处理成功
        }
    });
}
错误 3:忘记处理失败情况
// ❌ 错误:只处理成功情况
future.addListener(f -> {
    System.out.println("结果:" + f.getNow()); // 如果失败,getNow() 返回 null
});

// ✅ 正确:检查是否成功
future.addListener(f -> {
    if (f.isSuccess()) {
        System.out.println("结果:" + f.getNow());
    } else {
        System.err.println("失败:" + f.cause().getMessage());
    }
});

六、总结

  1. JDK Future:只能阻塞获取结果,没有回调功能,结果不可写
  2. Netty Future:在 JDK Future 基础上增加了回调功能(addListener()),但结果仍然不可写
  3. Netty Promise:在 Netty Future 基础上增加了结果可写功能(setSuccess()/setFailure())

记住这个关系:Promise 是可写的 Future,Future 是增强的 JDK Future。

在 Netty 中:

  • 调用框架方法时,返回的是 Future(你只能读)
  • 自己实现异步逻辑时,创建 Promise(你可以写)

希望这篇文章能帮助你理解 Netty 中的 Future 和 Promise!如果还有疑问,欢迎留言讨论。

RU.EXE实用指南:从基础操作到高级调试技巧 本文是RU.EXE(RW Everything)的实用指南,详细介绍了这款硬件调试工具从基础操作到高级技巧的全过程。文章阐述了RU.EXE作为直接读写硬件寄存器、内存和PCI配置空间的强大工具,如何帮助硬件工程师和开发人员高效进行底层系统调试与故障排查,并强调了安全操作的重要性。 阅读详情

相关推荐

Llama模型结构拆解:为什么MLP模块要这样设计?从参数配置到计算流程全解析

本文深入解析了Llama模型MLP模块的设计精髓。通过拆解其三线性层结构、门控机制与SwiGLU激活函数,揭示了并行计算如何提升效率,并详细阐述了intermediate_size参数配置背后的经验权衡与计算考量,帮助读者透彻理解这一核心组件的设计逻辑与工程实现。

mac99的博客 528

netty的Future异步回调难理解?手写个带回调异步框架就懂了

netty是一个经典的网络框架,提供了基于NIO、AIO的方式来完成少量线程支持海量用户请求连接的模型。netty里面充斥了大量的非阻塞回调模式,主要是靠Future/Promise异步模型来实现的。 Future是java.util.concurrent.Future,是Java提供的接口,可以用来做异步执行的状态获取,它避免了异步任务在调用者那里阻塞等待,而是让调用者可以迅速得到一个Futu...

1877

描边盛开火玫瑰

python描边盛开火玫瑰 代码如下 import turtle as t t.setup(800,800) t.hideturtle() t.speed(11) t.penup() t.goto(50,-450) t.pensize(5) t.pencolor("black") t.seth(140) t.pendown() t.speed(10) t.circle(-300,60) t.fd(100) #jiaodu80 #1ye t.seth(10) t.fd(50) t.fillcolor("gr

weixin_50973371的博客 2062

Netty系列四:第一个Netty程序(业务线程异步)

有了之前的基础之后,我们从netty官网的示例(略做修改),来开始netty之旅。我们实现一个支持hello world版的netty程序。首先我们创建一个主类:侦听 http端口,启动服务import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.Channe

cj2580的博客 1万+

Silvaco TCAD | GaN HEMT器件仿真与高频功率应用实战

本文详细介绍了使用Silvaco TCAD进行GaN HEMT器件仿真的全流程,涵盖器件结构设计、极化效应建模、高频特性分析及功率损耗优化。通过实战案例展示了GaN HEMT在电动汽车电驱和快充模块等高频功率应用中的性能优势与效率提升策略,为工程师提供可靠的仿真方法与设计验证手段。

desk3的博客 182

逆向学习:从已上线微信小游戏反推Cocos工程结构(以切水果跑酷为例)

本文以“切水果跑酷”为例,详细介绍了如何通过逆向分析已上线的微信小游戏,反推其基于Cocos Creator的原始工程结构。文章深入拆解了编译后的目录骨架、资源加载逻辑与依赖关系,并重点解析了微信平台API的调用特征,为开发者提供了一种高效学习游戏架构与设计模式的实用方法。

kk1234的博客 1070

Netty4之Future/Promise异步模型

在并发编程中,我们通常会用到一组非阻塞的模型:Promise,Future 和 Callback。其中的 Future 表示一个可能还没有实际完成的异步任务的结果,针对这个结果可以添加 Callback 以便在任务执行成功或失败后做出对应的操作,而 Promise 交由任务执行者,任务执行者通过 Promise 可以标记任务完成或者失败。 可以说这一套模型是很多异步非阻塞架构的基础。Netty 4中

至尊宝猴哥 1322

Qt QWebEngine实战:手把手教你将Vue3/React前端项目嵌入C++桌面程序

本文详细介绍了如何利用Qt的QWebEngine模块将Vue3/React前端项目无缝嵌入C++桌面程序,实现现代前端框架与原生C++的深度整合。通过环境准备、项目架构设计、前端适配、Qt端集成、双向通信建立及性能优化等步骤,开发者可以高效构建兼具Web灵活性和本地系统能力的混合应用。

weixin_28736355的博客 389

Netty笔记(四)之Future和Promise异步模型

文章目录netty版本Future/Promise异步模型简介FutureChannelFuturePromise netty版本 netty版本:io.netty:netty-all:4.1.29.Final Future/Promise异步模型 简介 在并发编程中,我们通常会用到一组非阻塞的模型:Promise,Future 和 Callback。其中的Future表示一个可能还没有实际...

jannal专栏 1720

Spark Catalog详解

旁边的实习生说:我想要用spark代码中对hive库中的内部表和外部表进行删除(包括数据),咋感觉网上搜了一圈都找不到解决方案啊,spark这么鸡肋吗?我:你应该静下心来好好把spark基础知识进行全面学习。实习生:难道spark有这功能,而我没有学习过?咋弄啊?我:学习一下Spark Catalog。实习生:啥是Catalog啊?Spark Catalog是Spark SQL中的一个元数据管理组件,它提供了一个集中化的存储和查询表、视图和函数的位置。

SunnyRivers 1813

基于Simulink进行光伏逆变器效率分析的仿真建模

特点能量转换:将光伏电池板产生的直流电转换为交流电。效率评估:分析逆变器在不同负载条件和环境条件下的效率。动态特性:考虑温度、光照强度等外部因素对逆变器效率的影响。挑战精确建模:准确地模拟光伏电池板、逆变器及其交互的动力学过程。多因素考量:需要同时考虑输入电压、电流、温度、光照强度等多种因素对逆变器效率的影响。集成度:需要与其他系统(如最大功率点跟踪MPPT算法、电网连接等)无缝集成,以实现全面的系统分析。首先明确要模拟的任务内容。输入条件(如光照强度、温度等)。

amy_mhd的博客 142

Java和netty的异步框架:Future体系

结合源码理解 netty 的 Future 和 Promise机制,为后续打下基础

oatlmy 925

基于STC8G1K08A单片机的EC11旋转编码器控制(江科大同款,代码可直接使用)

本文介绍了STC8G系列单片机与EC11旋转编码器的接口实现方案。硬件方面详细说明了EC11编码器的机械结构、电气特性及与单片机的典型连接电路,包括上拉电阻和消抖设计。软件部分重点阐述了状态检测算法,通过状态机和查找表实现方向判断,采用中断方式检测信号变化,并配合定时器进行软件消抖处理。文章还提供了完整的代码实现,包括GPIO初始化、中断服务函数、状态转换逻辑等关键模块,展示了如何通过串口输出验证旋转计数。最后讨论了抗抖动优化、高低速应用场景等实际问题解决方案。该方案在菜单导航、参数调节等场景中具有实用价值

weixin_74013772的博客 321

netty-Future、Promise和Listener源码分析

1 netty Future的基本使用 编程语言中的future,顾名思义就是一个操作在将来才会完成,但是调用方不必同步等待结果,只要持有对应操作的future对象即可,等操作完成了,从future中获取结果。 netty Future是实现其异步非阻塞IO机制的重要对象。本文从演示netty Future的基本使用开始,再到源码角度分析其实现原理,最后剖析其在netty的异步非阻塞IO中如何使用...

Joel.Wang老王的专栏 2003

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Netty权威指南】15-Future和Promise

1、Future功能 Future最早来源于JDK的java.util.concurrent.Future,它用于代表异步操作的结果。相关API如图19-1所示。 可以通过get方法获取操作结果,如果操作尚未完成,则会同步阻塞当前调用的线程;如果不允许阻塞太长时间或者无限期阻塞,可以通过带超时时间的get方法获取结果;如果到达超时时间操作仍然没有完成,则抛出 TimeoutException...

通往神秘的道路的专栏 4952

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

zyfun 跨平台视频播放器配置指南:5 步把播放调得又快又稳

4K 视频卡成幻灯片、影视和直播分散在三个窗口,是不是你的日常?zyfun 是一款免费的跨平台视频播放器,把影视、直播、网盘资源装进同一个窗口。它还有个独家老板键,按一下所有窗口立刻隐身。 ## zyfun 解决什么问题 - 网页播放器播 4K、H265 经常卡顿,本地播放器又装不下资源 - 影视、直播、历史分散在不同工具里,来回切换很折腾 - 每种资源源格式都要单独配解析器,导入门槛高 -

gitblog_00473的博客 1038

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Netty源码分析三 Future,Promise

前言 前面 分析了Netty整体的流程 和 Channel的结构,我们看到 Netty 中有很多的异步调用,所以在介绍更多 NIO 相关的内容之前,我们来看看它的异步接口是怎么实现的。 回顾 前面我们在介绍 Echo 例子的时候,已经用过了 ChannelFuture 这个接口了,接下来我们就来看看 Netty 中的异步调用是如何实现的。 客户端 // Start the client. Chan...

小张的专栏 788

Netty 异步机制深度解析:Future 与 Promise 的前世今生

Java 的 Future 不够用?Netty 的 Future 和 Promise 来补刀! 本篇文章不仅会帮你厘清标准 JDK Future 与 Netty 异步模型的关键差异,还会用实战代码展示 Promise 如何优雅解决异步嵌套、状态监听等难题,看完你就能写出更高质量的 Netty 项目代码!

学而时习之,不亦说乎?温故而知新,可以为师矣! 1080

【Netty】之 Future(Promise)

文章目录一、`Future`简介二、`Promise`简介(1)举个栗子(2)常用`Promise`类三、`Promise`源码浅析(1)`get()`(2)`await()`(3)`addListener()`(3)`notifyListeners()`(4)`setSuccess()`(5)`cancel()` Netty 版本:4.1.12.Final 一、Future简介 Nett...

fanfan4569的博客 551

Netty--Future和Promise

目录 概述 JDK.Future Netty.Future ChannelFuture Promise 继承关系 源码分析 AbstractFuture CompleteFuture DefaultPromise 概述 Future代表了异步操作的结果,Netty的Future对JDK的Future进行了扩展。 JDK.Future 仅定义了是否完成以及是否取消的...

demon7552003的小本本 489

Future和Promise

1、Future功能 Future最早来源于java.util.concurrent.Future,用于代表异步操作的结果。 可以通过get方法获取操作结果,如果操作尚未完成,则会同步阻塞当前调用的线程;如果不允许阻塞太长时间或者无限期阻塞,可以通过带超时时间的get获取结果;如果达到超时时间你操作仍然没有完成,则抛出TimeoutException。 可以通过isDone方法可以判断当前的...

sunshine052697的专栏 1115

Netty 源码分析系列(十七)Promise详解

上篇文章我们讲解了 Netty 的 Future,本篇文章我就就来分析一下可写的 Future,也就是promise,Netty 中的 Promise 扩展自 Netty 的 Future。以上我们分析了 Netty 中的 Promise,知道了它是扩展自 Netty 的 Future,是一个可写的 Future。

初念初恋的博客 2959

7. Netty源码分析之Future和Promise

一、Future   Future源自java.util.concurrent.Future,用于获取异步操作的结果,它通过get()方法获取异步操作结果,操作尚未完成,则阻塞。   Netty认为这是一个很不好的设计,操作结束时间难以确定,何不通过回调的方式获取结果呢。Netty的ChannelFuture通过监听的方式,当操作结束时调用注册在上面的方法获取操作结果。   Fut...

weixin_30783629的博客 523

netty源码分析之Future/Promise

一、前言在分析Netty的源码的时候,一直看到Future、Promise之类的类,Future之前还接触过一点 知道大致是什么东西,不过Promise没了解过,所以在分析源码之前,顺便学习下Future/Promise~二、Future1、Future是什么?首先需要明白一点的是,它不是netty自己私有的东西,它在jdk1.5后的concurrent包中就已经有 了. 通过一个例子了解本质

Mr.Lee 659

【Netty】Future 源码分析(十六)

Netty 概述(一)Netty 架构设计(二)Netty Channel 概述(三)Netty ChannelHandler(四)ChannelPipeline源码分析(五)字节缓冲区 ByteBuf (六)(上)字节缓冲区 ByteBuf(七)(下)Netty 如何实现零拷贝(八)Netty 程序引导类(九)Reactor 模型(十)工作原理详解(十一)Netty 解码器(十二)Netty 编码器(十三)Netty 编解码器(十四)自定义解码器、编码器、编解码器(十五)

DreamSun的博客 2664

Netty源码分析(二),Netty中的future和Promise,DefaultPromise的实现

JUC包中的future class Test { public static void main(String[] args) { FutureTask<Boolean> hTask = new FutureTask<>(() -> { System.out.println(getCurrentThreadName() + "---------"); System.out.println("洗好茶壶");

weixin_43869261的博客 476
上一篇: Netty源码分析篇:Netty 中的 Channel
下一篇: Netty源码分析篇:Netty Pipeline 初始化流程
不早睡不改名@
博客等级 码龄5年 536粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值