Netty从0到1系列之Promise


推荐阅读:

【01】Netty从0到1系列之I/O模型
【02】Netty从0到1系列之NIO
【03】Netty从0到1系列之Selector
【04】Netty从0到1系列之Channel
【05】Netty从0到1系列之Buffer(上)
【06】Netty从0到1系列之Buffer(下)
【07】Netty从0到1系列之零拷贝技术
【08】Netty从0到1系列之整体架构、入门程序
【09】Netty从0到1系列之EventLoop
【10】Netty从0到1系列之EventLoopGroup
【11】Netty从0到1系列之Future

一、Promise

1.1 Promise是什么?

Promise 是 Netty 异步编程模型中的核心组件,它代表一个可写的异步操作结果。与普通的 Future 不同,Promise 提供了主动设置操作结果(成功或失败)的能力,使得开发者可以手动控制异步操作的完成状态。

在 Netty 的异步编程模型中,Promise最核心、最灵活的组件之一。它是 Future可写版本,代表一个“尚未完成但可被设置结果的承诺”。你可以将其理解为:“我承诺将来会给你一个结果,而我(或某个操作)可以决定这个结果是成功还是失败。”

Promise 的核心特性:

  • 可写性:可以主动设置操作的成功结果或失败原因
  • 异步结果容器:承载异步操作的结果值或异常信息
  • 监听器通知:支持添加监听器,在结果设置时自动通知
  • 状态一致性:保证结果只能被设置一次,确保状态一致性
  • 线程安全:所有操作都是线程安全的
异步操作开始
创建 Promise
返回 Future 给调用者
操作执行中...
操作成功?
Promise.setSuccess(result)
Promise.setFailure(cause)
Future 状态变为 success
通知所有监听器
执行回调逻辑

🌟 核心职责

  • 创建一个可被设置结果的“未来”
  • 将异步操作的结果“承诺”给调用者
  • 实现异步操作的“生产者-消费者”模型

💡 关键特性

  • Promise可写的 Future
  • 一旦设置结果,不可更改
  • 可以添加监听器,实现回调驱动

1.2 Promise 的继承体系与核心方法

Promise 在 Netty 的继承体系中的位置如下:

io.netty.util.concurrent.Future<V>
    -> Promise<V> (扩展了结果设置能力)
        -> ChannelPromise (扩展了Channel相关功能)
            -> DefaultChannelPromise (主要实现)
    
io.netty.util.concurrent.Promise<V>
    -> DefaultPromise (基础实现)
java_util_concurrent_Future
io_netty_util_concurrent_Future
io_netty_util_concurrent_Promise
DefaultPromise

为了更好地理解 Promise 的状态转换和工作原理,请看下面的状态图:

创建Promise
setSuccess() / trySuccess()
setFailure() / tryFailure()
cancel()
获取结果
处理异常
操作中止
Uncompleted
Success
Failed
Cancelled
Promise核心能力:
1. 主动设置结果
2. 只能完成一次
3. 线程安全的状态转换
4. 监听器自动通知
Future
Promise
DefaultPromise
ChannelPromise
DefaultChannelPromise

接口定义:

public interface Promise<V> extends Future<V> {

    /**
     * 设置成功结果
     */
    Promise<V> setSuccess(V result);

    /**
     * 尝试设置成功结果(线程安全)
     */
    boolean trySuccess(V result);

    /**
     * 设置失败原因
     */
    Promise<V> setFailure(Throwable cause);

    /**
     * 尝试设置失败原因(线程安全)
     */
    boolean tryFailure(Throwable cause);

    /**
     * 标记为不可取消(一旦调用,无法取消)
     */
    boolean setUncancellable();

    /**
     * 返回关联的 EventExecutor(执行监听器的线程)
     */
    @Override
    EventExecutor executor();
}

核心方法

  • setSuccess() / setFailure()设置最终结果
  • trySuccess() / tryFailure()原子性尝试设置,避免重复设置
  • setUncancellable()防止被取消

1.3 Promise与Future的关系

Promise 与 Future 的关系是 Netty 异步模型的基础:

Future
+isDone() : boolean
+isSuccess() : boolean
+isCancelled() : boolean
+cause() : Throwable
+getNow() : V
+sync() : Future
+await() : Future
+addListener(Listener) : Future
Promise
+setSuccess(V) : boolean
+trySuccess(V) : boolean
+setFailure(Throwable) : boolean
+tryFailure(Throwable) : boolean
+setUncancellable() : boolean
  • Future:只读视图,只能查询状态和获取结果
  • Promise:可写视图,除了 Future 的功能外,还能设置结果、异常或取消操作

1.4 Promise 的底层实现原理

1.4.1 ✅ DefaultPromise 核心机制

DefaultPromisePromise默认实现类,其核心机制包括:

  • ✅ 状态机(State Machine)
setSuccess()
setFailure()
cancel()
UNSET
SUCCESS
FAILURE
CANCELLED
初始状态
  • 一旦状态变更(成功/失败/取消),不可逆
  • 保证“承诺”的唯一性和确定性
    • 使用 volatile int state 表示状态
    • 状态变更通过 CAS 操作保证原子性
// DefaultPromise 的核心状态管理(简化版)
public class DefaultPromise<V> implements Promise<V> {
    // 结果对象:null表示未完成,SUCCESS常量表示成功,其他表示具体结果或异常
    private volatile Object result;
    
    // 监听器列表
    private Object listeners;
    
    // 执行器,用于在正确的线程中执行监听器
    private final EventExecutor executor;
    
    private static final Object SUCCESS = new Object();
    private static final Object UNCANCELLABLE = new Object();
    
    @Override
    public Promise<V> setSuccess(V result) {
        if (setSuccess0(result)) {
            notifyListeners();
            return this;
        }
        throw new IllegalStateException("操作已完成: " + this);
    }
    
    private boolean setSuccess0(V result) {
        // 使用CAS操作确保原子性
        if (RESULT_UPDATER.compareAndSet(this, null, result == null ? SUCCESS : result)) {
            return true;
        }
        return false;
    }
    
    @Override
    public Promise<V> setFailure(Throwable cause) {
        if (setFailure0(cause)) {
            notifyListeners();
            return this;
        }
        throw new IllegalStateException("操作已完成: " + this);
    }
    
    private boolean setFailure0(Throwable cause) {
        // 使用CAS操作确保原子性
        if (RESULT_UPDATER.compareAndSet(this, null, cause)) {
            return true;
        }
        return false;
    }
    
    private void notifyListeners() {
        // 在正确的线程中执行监听器
        if (executor.inEventLoop()) {
            notifyListenersNow();
        } else {
            executor.execute(this::notifyListenersNow);
        }
    }
}
  • ✅ 监听器通知机制

内部维护一个 GenericFutureListener 列表

  • setSuccess()setFailure() 被调用时:
    • 更新状态和结果
    • 遍历监听器列表
    • EventExecutor 线程中异步执行每个监听器的 operationComplete() 方法
public class DefaultPromise<V> implements Promise<V> {
    private void notifyListenersNow() {
        Object listeners = this.listeners;
        if (listeners == null) {
            return;
        }
        
        // 处理不同类型的监听器存储
        if (listeners instanceof GenericFutureListener) {
            notifyListener0((GenericFutureListener<?>) listeners);
        } else if (listeners instanceof DefaultFutureListeners) {
            notifyListeners0((DefaultFutureListeners) listeners);
        } else {
            for (GenericFutureListener<?> l : (GenericFutureListener<?>[]) listeners) {
                notifyListener0(l);
            }
        }
    }
    
    private void notifyListener0(GenericFutureListener<?> listener) {
        try {
            // 调用监听器
            listener.operationComplete(this);
        } catch (Throwable t) {
            // 监听器异常不影响其他监听器
            System.err.println("监听器执行异常: " + t.getMessage());
        }
    }
    
    @Override
    public Promise<V> addListener(GenericFutureListener<? extends Future<? super V>> listener) {
        synchronized (this) {
            addListener0(listener);
        }
        
        // 如果已经完成,立即通知新添加的监听器
        if (isDone()) {
            notifyListener0(listener);
        }
        return this;
    }
}

线程安全保证

  • resultstate 使用 volatile 修饰
  • 使用 synchronized 或 CAS 操作保护状态变更
  • 监听器执行与状态变更解耦
  • ✅ 内存可见性
    • 使用 volatile 关键字确保状态和结果的内存可见性
    • 避免多线程环境下的缓存不一致问题

1.4.2 与 EventLoop 的协同

  • Promise 绑定到特定的 EventExecutor(通常是 EventLoop
  • 所有监听器在该 EventExecutor 的线程中执行
  • 保证无锁串行化,避免竞态条件
// 创建 Promise 时指定 Executor
Promise<String> promise = new DefaultPromise<>(eventLoop);

1.5 Promise 的核心 API 与用法

1.5.1 基础Promise使用

package cn.tcmeta.future;

import io.netty.util.concurrent.*;

import java.util.concurrent.TimeUnit;

/**
 * 演示 Promise 的基本用法
 */
public class PromiseBasicExample {

    public static void main(String[] args) throws Exception {
        // 创建 EventExecutor(模拟 EventLoop)
        EventExecutorGroup group = new DefaultEventExecutorGroup(2);
        EventExecutor executor = group.next();

        try {
            // 创建一个 Promise
            Promise<String> promise = new DefaultPromise<>(executor);

            // 调用者获取 Future(只读视图)
            Future<String> future = promise;

            // 添加监听器(回调)
            future.addListener((GenericFutureListener<Future<String>>) f -> {
                if (f.isSuccess()) {
                    System.out.println("✅ 任务成功: " + f.get());
                } else {
                    System.err.println("❌ 任务失败: " + f.cause().getMessage());
                }
            });

            // 模拟异步任务执行(生产者)
            executor.execute(() -> {
                try {
                    Thread.sleep(1000); // 模拟耗时操作
                    if (Math.random() > 0.3) {
                        promise.setSuccess("任务执行完毕");
                    } else {
                        promise.setFailure(new RuntimeException("任务执行失败"));
                    }
                } catch (Exception e) {
                    promise.setFailure(e);
                }
            });

            // 等待完成
            future.await(3, TimeUnit.SECONDS);

        } finally {
            group.shutdownGracefully();
        }
    }
}

在这里插入图片描述

1.5.2 Promise 的可写性与线程安全

trySuccess, trySuccess 是线程安全的,只会有一个成功;

package cn.tcmeta.promise;

import io.netty.util.concurrent.*;

import java.util.concurrent.TimeUnit;

/**
 * 演示 Promise 的线程安全与 trySuccess
 */
public class PromiseThreadSafetyExample {

    public static void main(String[] args) throws Exception {
        EventExecutor executor = new DefaultEventExecutor();
        // 共享的 Promise
        Promise<String> promise = new DefaultPromise<>(executor);

        // 启动多个线程尝试设置结果
        for (int i = 0; i < 5; i++) {
            final int taskId = i;
            executor.execute(() -> {
                // trySuccess 是线程安全的,只会有一个成功
                boolean success = promise.trySuccess("Task-" + taskId + " 完成");
                if (success) {
                    System.out.println("🏆 Task-" + taskId + " 成功设置结果");
                } else {
                    System.out.println("❌ Task-" + taskId + " 设置失败(已被其他线程设置)");
                }
            });
        }

        // 添加监听器
        promise.addListener((GenericFutureListener<Promise<String>>) f -> {
            if (f.isSuccess()) {
                System.out.println("🎉 最终结果: " + f.get());
            }
        });

        // 等待
        promise.await(2, TimeUnit.SECONDS);
        executor.shutdownGracefully();
    }
}

在这里插入图片描述

1.5.3 Promise 实现自定义异步操作

package cn.tcmeta.promise;

import io.netty.util.concurrent.*;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 模拟一个异步缓存服务
 */
public class AsyncCacheService {

    private final ConcurrentHashMap<String, String> cache = new ConcurrentHashMap<>();
    private final EventExecutor executor;
    private final AtomicLong taskId = new AtomicLong(0);

    public AsyncCacheService(EventExecutor executor) {
        this.executor = executor;
    }

    /**
     * 异步获取缓存值
     *
     * @param key 键
     * @return Promise,结果可用时通知
     */
    public Promise<String> getAsync(String key) {
        DefaultPromise<String> promise = new DefaultPromise<>(executor);

        executor.execute(() -> {
            try {
                Thread.sleep(200); // 模拟延迟
                String value = cache.get(key);
                if (value != null) {
                    promise.setSuccess(value);
                } else {
                    promise.setFailure(new RuntimeException("Key not found: " + key));
                }
            } catch (Exception e) {
                promise.setFailure(e);
            }
        });

        return promise;
    }

    /**
     * 异步设置缓存值
     */
    public Promise<Void> setAsync(String key, String value) {
        DefaultPromise<Void> promise = new DefaultPromise<>(executor);

        executor.execute(() -> {
            try {
                Thread.sleep(100);
                cache.put(key, value);
                promise.setSuccess(null);
            } catch (Exception e) {
                promise.setFailure(e);
            }
        });

        return promise;
    }

    // --- 测试 ---
    public static void main(String[] args) throws Exception {
        EventExecutorGroup group = new DefaultEventExecutorGroup(2);
        AsyncCacheService cacheService = new AsyncCacheService(group.next());

        try {
            // 1. 先设置值
            cacheService.setAsync("name", "Alice")
                    .addListener(f -> {
                        if (f.isSuccess()) {
                            System.out.println("✅ 缓存设置成功");
                            // 2. 再获取值
                            cacheService.getAsync("name")
                                    .addListener(f2 -> {
                                        if (f2.isSuccess()) {
                                            System.out.println("✅ 获取缓存: name = " + f2.get());
                                        }
                                    });
                        }
                    });

            // 等待完成
            Thread.sleep(2000);

        } finally {
            group.shutdownGracefully();
        }
    }
}

在这里插入图片描述

1.5.4 trySuccess vs setSuccess 的区别

package cn.tcmeta.promise;

import io.netty.util.concurrent.*;

/**
 * 演示 trySuccess 和 setSuccess 的区别
 */
public class TrySuccessVsSetSuccessExample {

    public static void main(String[] args) throws Exception {
        EventExecutor executor = new DefaultEventExecutor();
        // 创建 Promise
        Promise<Void> promise = new DefaultPromise<>(executor);

        // 添加监听器
        promise.addListener((GenericFutureListener<Promise<Void>>) f -> {
            if (f.isSuccess()) {
                System.out.println("监听器收到成功通知");
            } else {
                System.err.println("监听器收到失败通知: " + f.cause().getMessage());
            }
        });

        // 第一次设置成功
        boolean result1 = promise.trySuccess(null);
        System.out.println("第一次 trySuccess: " + result1); // true

        // 第二次设置(已锁定)
        try {
            promise.setSuccess(null); // ❌ 抛出 IllegalStateException
        } catch (IllegalStateException e) {
            System.err.println("setSuccess 第二次调用异常: " + e.getMessage());
        }

        boolean result2 = promise.trySuccess(null);
        System.out.println("第二次 trySuccess: " + result2); // false

        executor.shutdownGracefully();
    }
}

在这里插入图片描述

📌 结论

  • setSuccess():强制设置,失败则抛异常
  • trySuccess():尝试设置,失败则返回 false,更安全

1.5.5 Promise与异步操作结合

  • 模拟异步操作数据库
package cn.tcmeta.promise;

import io.netty.util.concurrent.DefaultEventExecutor;
import io.netty.util.concurrent.EventExecutor;
import io.netty.util.concurrent.Promise;

import java.util.concurrent.Callable;

public class PromiseWithAsyncOperation {
    public static void main(String[] args) throws InterruptedException {
        EventExecutor executor = new DefaultEventExecutor();

        // 模拟异步数据库查询
        Promise<String> dbQueryPromise = executeAsyncDatabaseQuery(executor, "SELECT * FROM users");

        // 添加多个监听器处理不同情况
        dbQueryPromise.addListener(future -> {
            if (future.isSuccess()) {
                System.out.println("数据库查询成功: " + future.getNow());
                processQueryResults((String) future.getNow());
            }
        });

        dbQueryPromise.addListener(future -> {
            if (future.isCancelled()) {
                System.out.println("数据库查询被取消");
            }
        });

        dbQueryPromise.addListener(future -> {
            if (!future.isSuccess() && !future.isCancelled()) {
                System.err.println("数据库查询失败: " + future.cause().getMessage());
                handleQueryFailure(future.cause());
            }
        });

        // 等待操作完成
        Thread.sleep(2000);
        executor.shutdownGracefully();
    }

    private static Promise<String> executeAsyncDatabaseQuery(EventExecutor executor, String query) {
        // 创建Promise
        Promise<String> promise = executor.newPromise();

        // 模拟异步执行数据库查询
        executor.submit(() -> {
            try {
                System.out.println("执行数据库查询: " + query);
                Thread.sleep(800); // 模拟查询耗时

                // 模拟随机成功/失败
                if (Math.random() > 0.2) {
                    String result = "用户数据: [User1, User2, User3]";
                    promise.setSuccess(result); // 设置成功结果
                } else {
                    throw new RuntimeException("数据库连接超时");
                }
            } catch (InterruptedException e) {
                promise.setFailure(e);
                Thread.currentThread().interrupt();
            } catch (Exception e) {
                promise.setFailure(e); // 设置失败结果
            }
        });

        return promise;
    }

    private static void processQueryResults(String results) {
        System.out.println("处理查询结果: " + results);
    }

    private static void handleQueryFailure(Throwable cause) {
        System.err.println("处理查询失败: " + cause.getMessage());
        // 记录日志、重试等操作
    }
}

在这里插入图片描述

1.6 实践经验与最佳实践

1.6.1 Promise 使用最佳实践

package cn.tcmeta.promise;

import io.netty.util.concurrent.*;

import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;

public class PromiseBestPractices {
    
    // 1. ✅✅ 正确的Promise创建方式
    public static Promise<String> createPromise(EventExecutor executor) {
        // 始终使用executor.newPromise()而不是new DefaultPromise()
        return executor.newPromise();
    }
    
    // 2. ✅✅ 安全的Promise结果设置
    public static void setPromiseResultSafely(Promise<String> promise, String result) {
        // 使用trySuccess/tryFailure而不是setSuccess/setFailure
        // 这样可以避免抛出IllegalStateException
        if (!promise.trySuccess(result)) {
            System.out.println("Promise已经完成,无法设置结果");
            // 可以在这里处理已经完成的情况
        }
    }
    
    // 3. ✅✅ 带超时控制的Promise
    public static Promise<String> createTimeoutPromise(EventExecutor executor, long timeoutMs) {
        Promise<String> promise = executor.newPromise();
        
        // 设置超时监听器
        executor.schedule(() -> {
            if (!promise.isDone()) {
                System.out.println("操作超时,取消Promise");
                promise.tryFailure(new TimeoutException("超时了~~~"));
            }
        }, timeoutMs, TimeUnit.MILLISECONDS);
        
        return promise;
    }
    
    // 4. ✅✅ Promise组合模式
    public static Promise<String> combinePromises(EventExecutor executor, 
                                                Promise<String> promise1, 
                                                Promise<String> promise2) {
        Promise<String> combinedPromise = executor.newPromise();
        
        // 监听第一个Promise
        promise1.addListener(f1 -> {
            if (f1.isSuccess() && promise2.isSuccess()) {
                String result1 = (String) f1.getNow();
                String result2 = promise2.getNow();
                combinedPromise.setSuccess(result1 + " & " + result2);
            } else if (!f1.isSuccess()) {
                combinedPromise.setFailure(f1.cause());
            }
        });
        
        // 监听第二个Promise
        promise2.addListener(f2 -> {
            if (f2.isSuccess() && promise1.isSuccess()) {
                String result1 = promise1.getNow();
                String result2 = (String) f2.getNow();
                combinedPromise.setSuccess(result1 + " & " + result2);
            } else if (!f2.isSuccess() && !combinedPromise.isDone()) {
                combinedPromise.setFailure(f2.cause());
            }
        });
        
        return combinedPromise;
    }
    
    // 5. ✅✅ 错误处理和重试机制
    public static void executeWithRetry(EventExecutor executor, 
                                      Callable<String> task,
                                      int maxRetries,
                                      Promise<String> resultPromise) {
        AtomicInteger attempt = new AtomicInteger(0);
        
        executor.execute(() -> {
            int currentAttempt = attempt.incrementAndGet();
            try {
                String result = task.call();
                resultPromise.setSuccess(result);
            } catch (Exception e) {
                if (currentAttempt < maxRetries) {
                    System.out.println("尝试 " + currentAttempt + " 失败,准备重试: " + e.getMessage());
                    // 延迟后重试
                    executor.schedule(() -> 
                        executeWithRetry(executor, task, maxRetries, resultPromise),
                        100, TimeUnit.MILLISECONDS);
                } else {
                    resultPromise.setFailure(new RuntimeException("所有重试尝试都失败了", e));
                }
            }
        });
    }
    
    public static void main(String[] args) throws InterruptedException {
        EventExecutor executor = new DefaultEventExecutor();
        
        System.out.println("=== 测试安全结果设置 ===");
        Promise<String> promise1 = createPromise(executor);
        setPromiseResultSafely(promise1, "测试结果");
        setPromiseResultSafely(promise1, "第二次设置应该失败");
        
        System.out.println("=== 测试超时控制 ===");
        Promise<String> timeoutPromise = createTimeoutPromise(executor, 500);
        Thread.sleep(600); // 等待超时
        System.out.println("超时Promise状态: " + timeoutPromise.isDone());
        
        System.out.println("=== 测试重试机制 ===");
        Promise<String> retryPromise = createPromise(executor);
        executeWithRetry(executor, () -> {
            if (Math.random() > 0.7) {
                return "成功结果";
            }
            throw new RuntimeException("模拟失败");
        }, 3, retryPromise);
        
        retryPromise.addListener(f -> {
            if (f.isSuccess()) {
                System.out.println("重试成功: " + f.getNow());
            } else {
                System.err.println("重试失败: " + f.cause().getMessage());
            }
        });
        
        Thread.sleep(2000);
        executor.shutdownGracefully();
    }
}
=== 测试安全结果设置 ===
Promise已经完成,无法设置结果
=== 测试超时控制 ===
操作超时,取消Promise
超时Promise状态: true
=== 测试重试机制 ===
尝试 1 失败,准备重试: 模拟失败
尝试 1 失败,准备重试: 模拟失败
尝试 1 失败,准备重试: 模拟失败
尝试 1 失败,准备重试: 模拟失败
重试成功: 成功结果

1.6.2 Promise高级用法

package cn.tcmeta.promise;

import io.netty.util.concurrent.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class AdvancedPromiseUsage {
    
    // 1. Promise 聚合模式
    public static Promise<List<String>> aggregatePromises(EventExecutor executor, 
                                                        List<Promise<String>> promises) {
        Promise<List<String>> aggregatePromise = executor.newPromise();
        List<String> results = new CopyOnWriteArrayList<>();
        AtomicInteger completedCount = new AtomicInteger(0);
        
        for (Promise<String> promise : promises) {
            promise.addListener(future -> {
                if (future.isSuccess()) {
                    results.add((String) future.getNow());
                }
                
                // 检查是否所有Promise都完成了
                if (completedCount.incrementAndGet() == promises.size()) {
                    if (results.size() == promises.size()) {
                        aggregatePromise.setSuccess(results);
                    } else {
                        aggregatePromise.setFailure(new RuntimeException("部分操作失败"));
                    }
                }
            });
        }
        
        return aggregatePromise;
    }
    
    // 2. Promise 链式操作
    public static Promise<String> createOperationChain(EventExecutor executor, String input) {
        Promise<String> finalPromise = executor.newPromise();
        
        // 第一阶段:处理输入
        Promise<String> stage1 = executor.newPromise();
        executor.execute(() -> {
            try {
                String result1 = "阶段1-" + input.toUpperCase();
                stage1.setSuccess(result1);
            } catch (Exception e) {
                stage1.setFailure(e);
            }
        });
        
        // 第二阶段:基于第一阶段结果继续处理
        stage1.addListener(f1 -> {
            if (f1.isSuccess()) {
                Promise<String> stage2 = executor.newPromise();
                executor.execute(() -> {
                    try {
                        String result2 = "阶段2-" + ((String) f1.getNow()).length();
                        stage2.setSuccess(result2);
                    } catch (Exception e) {
                        stage2.setFailure(e);
                    }
                });
                
                // 第三阶段:完成链式操作
                stage2.addListener(f2 -> {
                    if (f2.isSuccess()) {
                        finalPromise.setSuccess("最终结果-" + f2.getNow());
                    } else {
                        finalPromise.setFailure(f2.cause());
                    }
                });
            } else {
                finalPromise.setFailure(f1.cause());
            }
        });
        
        return finalPromise;
    }
    
    // 3. 可取消的Promise操作
    public static Promise<String> createCancellableOperation(EventExecutor executor, 
                                                           Callable<String> task) {
        Promise<String> promise = executor.newPromise();
        
        // 提交任务
        Future<?> taskFuture = executor.submit(() -> {
            try {
                if (!promise.isCancelled()) {
                    String result = task.call();
                    promise.setSuccess(result);
                }
            } catch (Exception e) {
                if (!promise.isCancelled()) {
                    promise.setFailure(e);
                }
            }
        });
        
        // 设置取消回调
        promise.addListener(f -> {
            if (f.isCancelled()) {
                taskFuture.cancel(true);
                System.out.println("任务已取消");
            }
        });
        
        return promise;
    }
    
    public static void main(String[] args) throws InterruptedException {
        EventExecutor executor = new DefaultEventExecutor();
        
        System.out.println("=== 测试Promise聚合 ===");
        List<Promise<String>> promises = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            Promise<String> promise = executor.newPromise();
            promises.add(promise);
            
            // 模拟异步设置结果
            int finalI = i;
            executor.execute(() -> {
                try {
                    Thread.sleep(100 * (finalI + 1));
                    promise.setSuccess("结果-" + finalI);
                } catch (InterruptedException e) {
                    promise.setFailure(e);
                }
            });
        }
        
        Promise<List<String>> aggregate = aggregatePromises(executor, promises);
        aggregate.addListener(f -> {
            if (f.isSuccess()) {
                System.out.println("聚合结果: " + f.getNow());
            }
        });
        
        System.out.println("=== 测试链式操作 ===");
        Promise<String> chain = createOperationChain(executor, "test");
        chain.addListener(f -> System.out.println("链式结果: " + f.getNow()));
        
        System.out.println("=== 测试可取消操作 ===");
        Promise<String> cancellable = createCancellableOperation(executor, () -> {
            Thread.sleep(1000);
            return "长时间运行的结果";
        });
        
        // 添加取消逻辑
        executor.schedule(() -> {
            if (!cancellable.isDone()) {
                cancellable.cancel(true);
            }
        }, 500, TimeUnit.MILLISECONDS);
        
        Thread.sleep(2000);
        executor.shutdownGracefully();
    }
}

在这里插入图片描述

1.7 最佳实践与常见陷阱

1.7.1 ✅ 推荐实践

实践说明
优先使用 trySuccess()避免 IllegalStateException
在正确的线程中设置结果通常在 EventLoop 或任务线程中
及时释放资源在监听器中清理临时对象
处理所有异常确保 setFailure() 被调用
避免在监听器中阻塞防止阻塞 EventLoop

1.7.2 ⚠️ 常见错误

// ❌ 错误:在非 EventLoop 线程中创建监听器并阻塞
someFuture.addListener(f -> {
    f.sync(); // ❌ 死锁风险!
});

// ✅ 正确:使用嵌套监听器
someFuture.addListener(f1 -> {
    anotherFuture.addListener(f2 -> {
        // 处理两个结果
    });
});

1.8 Promise优缺点分析

1.8.1 ✅ 优点

优点说明
真正的异步编程基石实现非阻塞 I/O 的关键
解耦生产者与消费者任务执行者与结果处理者分离
线程安全多线程环境下可靠
支持链式调用构建复杂异步流程
性能优异避免线程阻塞,资源利用率高

1.8.2 ❌ 缺点

缺点说明
学习成本高需理解异步模型和回调机制
调试困难堆栈不连续,日志分散
错误处理分散每个监听器需独立处理异常
过度使用 sync()易导致死锁或性能问题

1.9 Promise的核心价值

维度说明
核心角色异步操作的“可写承诺”
设计模式生产者-消费者 + 观察者模式
核心能力设置结果 + 通知监听器
适用场景所有异步 I/O、自定义异步任务、资源获取
Netty 地位ChannelFutureBootstrap.connect() 等底层都基于 Promise

1.10 ✅ 一句话总结

Netty 的 Promise 是异步编程的“开关”

  • 它让你从被动等待结果(Future)转变为主动交付结果(Promise)
  • 构建高性能、可扩展网络应用核心原语
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值