Netty4之Future/Promise异步模型

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

         Netty文档说明Netty的网络操作都是异步的, 在源码上大量使用了Future/Promise模型,在Netty里面也是这样定义的:

  • Future接口定义了isSuccess(),isCancellable(),cause(),这些判断异步执行状态的方法。(read-only)
  • Promise接口在extneds future的基础上增加了setSuccess(), setFailure()这些方法。(writable)

Java.util.concurrent.Future是Java提供的接口,表示异步执行的状态,Future的get方法会判断任务是否执行完成,如果完成就返回结果,否则阻塞线程,直到任务完成。

[java] view plain copy
  1. // Java FutureTask.get()  
  2.   
  3. public V get() throws InterruptedException, ExecutionException {  
  4.         int s = state;  
  5.         if (s <= COMPLETING)  
  6.             s = awaitDone(false, 0L);  
  7.         return report(s);  
  8.     }  

Netty扩展了Java的Future,最主要的改进就是增加了监听器Listener接口,通过监听器可以让异步执行更加有效率,不需要通过get来等待异步执行结束,而是通过监听器回调来精确地控制异步执行结束的时间点。
[java] view plain copy
  1. public interface Future extends java.util.concurrent.Future {  
  2.   
  3.     boolean isSuccess();  
  4.   
  5.     boolean isCancellable();  
  6.   
  7.     Throwable cause();  
  8.   
  9.     Future addListener(GenericFutureListenerextends Futuresuper V>> listener);  
  10.   
  11.     Future addListeners(GenericFutureListenerextends Futuresuper V>>… listeners);  
  12.   
  13.     Future removeListener(GenericFutureListenerextends Futuresuper V>> listener);  
  14.   
  15.     Future removeListeners(GenericFutureListenerextends Futuresuper V>>… listeners);  
  16.   
  17.     Future sync() throws InterruptedException;  
  18.   
  19.     Future syncUninterruptibly();  
  20.   
  21.     Future await() throws InterruptedException;  
  22.   
  23.     Future awaitUninterruptibly();  
  24.   
  25.     boolean await(long timeout, TimeUnit unit) throws InterruptedException;  
  26.   
  27.     boolean await(long timeoutMillis) throws InterruptedException;  
  28.   
  29.     boolean awaitUninterruptibly(long timeout, TimeUnit unit);  
  30.   
  31.     boolean awaitUninterruptibly(long timeoutMillis);  
  32.   
  33.     V getNow();  
  34.   
  35.     boolean cancel(boolean mayInterruptIfRunning);  
  36. }  

ChannelFuture接口扩展了Netty的Future接口,表示一种没有返回值的异步调用,同时关联了Channel,跟一个Channel绑定
[java] view plain copy
  1. public interface ChannelFuture extends Future {  
  2.   
  3.     Channel channel();  
  4.   
  5.     @Override  
  6.     ChannelFuture addListener(GenericFutureListenerextends Futuresuper Void>> listener);  
  7.   
  8.     @Override  
  9.     ChannelFuture addListeners(GenericFutureListenerextends Futuresuper Void>>… listeners);  
  10.   
  11.     @Override  
  12.     ChannelFuture removeListener(GenericFutureListenerextends Futuresuper Void>> listener);  
  13.   
  14.     @Override  
  15.     ChannelFuture removeListeners(GenericFutureListenerextends Futuresuper Void>>… listeners);  
  16.   
  17.     @Override  
  18.     ChannelFuture sync() throws InterruptedException;  
  19.   
  20.     @Override  
  21.     ChannelFuture syncUninterruptibly();  
  22.   
  23.     @Override  
  24.     ChannelFuture await() throws InterruptedException;  
  25.   
  26.     @Override  
  27.     ChannelFuture awaitUninterruptibly();  
  28. }  

Promise接口也扩展了Future接口,它表示一种可写的Future,就是可以设置异步执行的结果
[java] view plain copy
  1. public interface Promise extends Future {  
  2.   
  3.     Promise setSuccess(V result);  
  4.   
  5.     boolean trySuccess(V result);  
  6.   
  7.     Promise setFailure(Throwable cause);  
  8.   
  9.     boolean tryFailure(Throwable cause);  
  10. }   

ChannelPromise接口扩展了Promise和ChannelFuture,绑定了Channel,又可写异步执行结构,又具备了监听者的功能,是Netty实际编程使用的表示异步执行的接口


[java] view plain copy
  1. public interface ChannelPromise extends ChannelFuture, Promise {  
  2.   
  3.     @Override  
  4.     Channel channel();  
  5.   
  6.     @Override  
  7.     ChannelPromise setSuccess(Void result);  
  8.   
  9.     ChannelPromise setSuccess();  
  10.   
  11.     boolean trySuccess();  
  12.   
  13.     @Override  
  14.     ChannelPromise setFailure(Throwable cause);  
  15.   
  16.     @Override  
  17.     ChannelPromise addListener(GenericFutureListenerextends Futuresuper Void>> listener);  
  18.   
  19.     @Override  
  20.     ChannelPromise addListeners(GenericFutureListenerextends Futuresuper Void>>… listeners);  
  21.   
  22.     @Override  
  23.     ChannelPromise removeListener(GenericFutureListenerextends Futuresuper Void>> listener);  
  24.   
  25.     @Override  
  26.     ChannelPromise removeListeners(GenericFutureListenerextends Futuresuper Void>>… listeners);  
  27.   
  28.     @Override  
  29.     ChannelPromise sync() throws InterruptedException;  
  30.   
  31.     @Override  
  32.     ChannelPromise syncUninterruptibly();  
  33.   
  34.     @Override  
  35.     ChannelPromise await() throws InterruptedException;  
  36.   
  37.     @Override  
  38.     ChannelPromise awaitUninterruptibly();  
  39. }  

DefaultChannelPromise是ChannelPromise的实现类,它是实际运行时的Promoise实例。Channel接口提供了newPromise接口,表示Channel要创建一个异步执行的动作

[java] view plain copy
  1. public interface Channel extends AttributeMap, Comparable {  
  2.     ChannelPromise newPromise();  
  3. }  
  4.   
  5. public abstract class AbstractChannel extends DefaultAttributeMap implements Channel {  
  6.     public ChannelPromise newPromise() {  
  7.         return new DefaultChannelPromise(this);  
  8.     }  
  9. }  

Netty推荐使用addListener的方式来回调异步执行的结果,这种方式优于Future.get,能够更精确地把握异步执行结束的时间

你可能感兴趣的:(Java,精华文章)