Netty 中的 Future & Promise
Netty 源码中大量使用了异步编程,从代码实现角度看就是大量使用了线程池和 Future。
熟悉 Java 5 的同学一定对 Future 不陌生。简单来说就是其代表了一个异步任务,任务将在未来某个时刻完成,而 Future 这个接口就是用来提供例如获取接口、查看任务状态等功能。
Netty 扩展了 Java 5 引入的 Future 机制。从下面的类图我们可以看到相关类的关系:

Netty 的 Future 接口
需要注意的是,上面类图中有两个 Future,最上面的是 java.util.concurrent.Future,而其下面的则是 io.netty.util.concurrent.Future。
JDK 的 Future 对象,该接口的方法如下:
// 取消异步操作
boolean cancel(boolean mayInterruptIfRunning);
// 异步操作是否取消
boolean isCancelled();
// 异步操作是否完成,正常终止、异常、取消都是完成
boolean isDone();
// 阻塞直到取得异步操作结果
V get() throws InterruptedException, ExecutionException;
// 同上,但最长阻塞时间为timeout
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
接口中只有 isDone() 方法判断一个异步操作是否完成,但是对于完成的定义过于模糊,JDK 文档指出正常终止、抛出异常、用户取消都会使 isDone() 方法返回真。在我们的使用中,我们极有可能是对这三种情况分别处理,而 JDK 这样的设计不能满足我们的需求。
Netty 扩展了 JDK 的 Future 接口,扩展的方法如下:
// 异步操作完成且正常终止
boolean isSuccess();
// 异步操作是否可以取消
boolean isCancellable();
// 异步操作失败的原因
Throwable cause();
// 添加一个监听者,异步操作完成时回调,类比javascript的回调函数
Future<V> addListener(
GenericFutureListener<? extends Future<? super V>> listener);
Future<V> removeListener(
GenericFutureListener<? extends Future<? super V>> listener);
// 阻塞直到异步操作完成
Future<V> await() throws InterruptedException;
// 同上,但异步操作失败时抛出异常
Future<V> sync() throws InterruptedException;
// 非阻塞地返回异步结果,如果尚未完成返回null
V getNow();

可知,Future 对象有两种状态尚未完成和已完成,其中已完成又有三种状态:成功、失败、用户取消。
Future 接口中的方法都是 getter 方法而没有 setter 方法,也就是说这样实现的 Future 子类的状态是不可变的,如果我们想要变化,Netty 提供的解决方法是:使用可写的 Future 即 Promise。
Netty 的 Promise
Promise 是特殊的可写 Future。Promise 在继承 Future 的基础之上进行了扩展,用来设置 IO 操作的结果。
当 Netty 进行 IO 操作的时候,会创建一个 Promise 对象,当操作完成或者失败的时候就会对 Promise 进行结果设置。
Promise<V> setSuccess(V result);
boolean trySuccess(V result);
Promise<V> setFailure(Throwable cause);
boolean tryFailure(Throwable cause);
boolean setUncancellable();
This chapter requires login to view full content. You are viewing a preview.
Login to View Full Content