《Netty》从零开始学netty源码(三十五)之DefaultChannelPromise

DefaultChannelPromise

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

类结构图

《Netty》从零开始学netty源码(三十五)之DefaultChannelPromise_第1张图片

属性值

《Netty》从零开始学netty源码(三十五)之DefaultChannelPromise_第2张图片

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

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

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

trySuccess

trySuccess的源码过程如下:

《Netty》从零开始学netty源码(三十五)之DefaultChannelPromise_第3张图片

接下来分析checkNotifyWaitersnotifyListeners方法。

checkNotifyWaiters方法

如果有waiters则进行唤醒

《Netty》从零开始学netty源码(三十五)之DefaultChannelPromise_第4张图片

notifyListeners方法

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

《Netty》从零开始学netty源码(三十五)之DefaultChannelPromise_第5张图片

notifyListenersNow方法

《Netty》从零开始学netty源码(三十五)之DefaultChannelPromise_第6张图片

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

《Netty》从零开始学netty源码(三十五)之DefaultChannelPromise_第7张图片

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

在这里插入图片描述

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

你可能感兴趣的:(Netty,netty)