Netty中的Future体系
- Future体系在线程池部分有分析过,它代表了一个异步操作的结果,一个典型的子接口和实现是RunnableFuture接口和FutureTask。相关内容可以参考:Future接口
- 在Netty中有着大量的异步操作,在获取异步操作结果也需要使用到Future,不过对于Netty而言,JDK中的Future机制相对来说简单,为了更加方便的异步编程,Netty基于Future接口扩展了一些自己的接口,我们先看看有哪些接口体系。
一、Future
- JDK中的Future接口是java.util.concurrent.Future,Netty中也有Future接口,全类名是io.netty.util.concurrent.Future,它继承自JDK中的Future接口,也是整个NettyFuture体系的顶层接口,对于的继承关系如下:
- 看的出来继承关系是比较复杂的,每一个类都去分析显然也比较困难,本文我们就先从接口开始,看看Netty的Future和它派生出来的子接口分别代表什么。
1.1 Future接口
1.1.1 JDK Future
- 参考文章[1]中我们分析了JUC包中的Future,它定义的方法不算多,我们看看Netty/Future有什么扩展。
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;
}
1.1.2 Netty Future
@SuppressWarnings("ClassNameSameAsAncestorName")
public interface Future<V> extends java.util.concurrent.Future<V> {
boolean isSuccess();
boolean isCancellable();
Throwable cause();
Future<V> addListener(GenericFutureListener<? extends Future<? super V>> listener);
Future<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener);
Future<V> sync() throws InterruptedException;
Future<V> syncUninterruptibly();
Future<V> await() throws InterruptedException;
Future<V> awaitUninterruptibly();
boolean await(long timeout, TimeUnit unit) throws InterruptedException;
boolean awaitUninterruptibly(long timeout, TimeUnit unit);
V getNow();
@Override
boolean cancel(boolean mayInterruptIfRunning);
}
- 由此我们看到Netty中的Future除了继承自JDK的Future之外,还定义了许多自己的方法,比如最重要的是添加监听器,这样就能在任务结束之后自动回调监听器中自己需要执行的逻辑。
1.2 Future派生子接口
1.2.1 Promise
- Promise代表可写的Future,在Future接口中,我们只能对其进行“读”操作,获取结果,判断是否完成等,但是我们不能对其进行写操作。而Promise代表可写的Future,Promise增强了Future的功能,通过Promise可以为Future设置结果,比如成功或者失败原因等。
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();
}
1.2.2 ChannelFuture
- ChannelFuture是代表一个Channel异步IO操作的结果,自身自定义了1个主要方法,将Future关联的Channel对象返回
public interface ChannelFuture extends Future<Void> {
Channel channel();
boolean isVoid();
}
1.2.3 ChannelGroupFuture
- ChannelGroupFuture代表一个ChannelGroup的IO执行结果
public interface ChannelGroupFuture extends Future<Void>, Iterable<ChannelFuture> {
ChannelGroup group();
ChannelFuture find(Channel channel);
@Override
boolean isSuccess();
@Override
ChannelGroupException cause();
boolean isPartialSuccess();
boolean isPartialFailure();
}
1.2.4 ProgressiveFuture
- ProgressiveFuture是用于代表一个操作进度的Future,本身没有定义任何方法,都是继承自Future
1.2.5 ScheduledFuture
- ScheduledFuture用于代表一个预定的异步操作(scheduled asynchronous operation)的结果。
1.3 抽象实现类AbstractFuture
- AbstractFuture是Future的一个抽象实现类,AbstractFuture没有实现什么方法,只实现了get()方法,方法内部还依赖很多其他的方法,比如:await()、cause()、getNow() , 这些都需要子类去实现。
public abstract class AbstractFuture<V> implements Future<V> {
@Override
public V get() throws InterruptedException, ExecutionException {
await();
Throwable cause = cause();
if (cause == null) {
return getNow();
}
if (cause instanceof CancellationException) {
throw (CancellationException) cause;
}
throw new ExecutionException(cause);
}
@Override
public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
if (await(timeout, unit)) {
Throwable cause = cause();
if (cause == null) {
return getNow();
}
if (cause instanceof CancellationException) {
throw (CancellationException) cause;
}
throw new ExecutionException(cause);
}
throw new TimeoutException();
}
}
二、小结
- 本文主要介绍了Netty中的Future接口,它继承自JDK的Future接口,并扩展了一些方法,主要是增加了对监听器的支持。
- Netty的Future接口派生出了很多子接口, 派生出的子接口自然具备Future这个基本的功能,除此之外,各自具备一些自身的接口特点,比如
Promise代表可写的Future,ChannelFuture代表Channel异步IO的结果,ChannelGroupFuture代表一个ChannelGroup的结果,ProgressiveFuture代表一个操作进度,ScheduledFuture代表预定操作的结果,具体不同的接口往下继续派生的接口和子类,我们在后面根据重要程序和使用情况慢慢分析,这也不是一篇文章足以涵盖的。
三、参考