Netty4之Future/Promise异步模型

Java 精华文章 专栏收录该内容
165 篇文章 4 订阅

         在并发编程中,我们通常会用到一组非阻塞的模型: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方法会判断任务是否执行完成,如果完成就返回结果,否则阻塞线程,直到任务完成。

  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来等待异步执行结束,而是通过监听器回调来精确地控制异步执行结束的时间点。
  1. public interface Future<V> extends java.util.concurrent.Future<V> {  
  2.   
  3.     boolean isSuccess();  
  4.   
  5.     boolean isCancellable();  
  6.   
  7.     Throwable cause();  
  8.   
  9.     Future<V> addListener(GenericFutureListener<? extends Future<? super V>> listener);  
  10.   
  11.     Future<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners);  
  12.   
  13.     Future<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener);  
  14.   
  15.     Future<V> removeListeners(GenericFutureListener<? extends Future<? super V>>... listeners);  
  16.   
  17.     Future<V> sync() throws InterruptedException;  
  18.   
  19.     Future<V> syncUninterruptibly();  
  20.   
  21.     Future<V> await() throws InterruptedException;  
  22.   
  23.     Future<V> 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绑定
  1. public interface ChannelFuture extends Future<Void> {  
  2.   
  3.     Channel channel();  
  4.   
  5.     @Override  
  6.     ChannelFuture addListener(GenericFutureListener<? extends Future<? super Void>> listener);  
  7.   
  8.     @Override  
  9.     ChannelFuture addListeners(GenericFutureListener<? extends Future<? super Void>>... listeners);  
  10.   
  11.     @Override  
  12.     ChannelFuture removeListener(GenericFutureListener<? extends Future<? super Void>> listener);  
  13.   
  14.     @Override  
  15.     ChannelFuture removeListeners(GenericFutureListener<? extends Future<? super 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,就是可以设置异步执行的结果
  1. public interface Promise<V> extends Future<V> {  
  2.   
  3.     Promise<V> setSuccess(V result);  
  4.   
  5.     boolean trySuccess(V result);  
  6.   
  7.     Promise<V> setFailure(Throwable cause);  
  8.   
  9.     boolean tryFailure(Throwable cause);  
  10. }   

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


  1. public interface ChannelPromise extends ChannelFuture, Promise<Void> {  
  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(GenericFutureListener<? extends Future<? super Void>> listener);  
  18.   
  19.     @Override  
  20.     ChannelPromise addListeners(GenericFutureListener<? extends Future<? super Void>>... listeners);  
  21.   
  22.     @Override  
  23.     ChannelPromise removeListener(GenericFutureListener<? extends Future<? super Void>> listener);  
  24.   
  25.     @Override  
  26.     ChannelPromise removeListeners(GenericFutureListener<? extends Future<? super 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要创建一个异步执行的动作

  1. public interface Channel extends AttributeMap, Comparable<Channel> {  
  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,能够更精确地把握异步执行结束的时间
  • 7
    点赞
  • 2
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值