36、Netty源码分析:DefaultChannelPromise

DefaultChannelPromise

在分析Unsafe或者ChannelPipeline的方法时经常出现Promise类,它用来保存channel的状态值,默认使用的是DefaultChannelPromise,接下来分析这个类。

类结构图

*

属性值

*

DefaultChannelPromise中有一个属性result,它用来保存channel的状态值,通过AtomicReferenceFieldUpdater类型的RESULT_UPDATER来进行原子更新result值,它的值一般有null、SUCCESS、UNCANCELLABLE。

当result值变化时会触发监听器。

接下来我们以最常用的方法trySuccess来分析DefaultChannelPromise的使用方法及用途。

trySuccess

trySuccess的源码过程如下:

*

接下来分析checkNotifyWaitersnotifyListeners方法。

checkNotifyWaiters方法

如果有waiters则进行唤醒

*

notifyListeners方法

在netty中很多操作都是异步的,所以会多次多处调用notifyListeners方法,为了防止无止境的循环调用对触发监听器的逻辑进行了栈深度保护策略,默认最大深度为8,可通过参数修改。注意,这里是要在同一个线程才有意义,所以需要判断是否inEventLoop。

*

notifyListenersNow方法

*

如果有多个listeners则逐个触发监听器listener

*

如果只有一个listener则调用监听器的operationComplete方法进行相应的处理。

*

至此,netty的DefaultChannelPromise分析至此完毕。

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: