java吧 关注:1,276,744贴子:12,792,989
  • 2回复贴,共1

netty中的promise和future源码分析

只看楼主收藏回复

(文末有白嫖惊喜哦!)
netty中的操作是异步操作,需要使用future来表示异步操作的结果。netty在jdk中的future的基础上进行了扩展。接下来采用自顶向下的方式对future和promise的源码进行分析:

(一)jdk中future和netty中future的比较
jdk中future:

jdk中future的特点:
1.无论结果是成功还是失败还是取消,返回的都是isdone();
2.而且我们在异步操作触发和结束的时候比较关心其他的一些操作,在jdk的future中无法进行补充。所以netty对future做了扩展
netty中future(以下为扩展内容):

netty中future的特点:
1.操作结果分为success,fail,canceled三种;
2.并且通过addlisteners()方法可以添加回调操作,即触发或者完成时需要进行的操作;
3.await()和sync(),可以以阻塞的方式等待异步完成;getnow()可以获得异步操作的结果,如果还未完成则返回Null;
综合以上的分析,给出一张表示future的状态图来加强对future的理解:

ps:future只有两种状态,unconpleted和conpleted.


1楼2020-06-27 16:06回复
    (二)abstractfuture
    abstractfuture类实现future接口,在其中主要实现了get()方法,以阻塞的方式来取得异步操作的结果,其功能与jdk中future的get()方法类似。
    abstractfuture源码:

    该类中get(long timeout, TimeUnit unit) 实现方式与get()大致相同。
    (三)completefuture
    completedfuture表示已经完成异步操作,该类在异步操作结束时创建,用户使用addlistener()方法提供异步操作方法。
    completefuture的状态

    completefuture表示已经完成异步操作,所以isdone()方法返回true;并且sync()方法和await()方法会立即返回。

    触发操作的执行者(eventexecutor)

    completefuture中维护了一个eventexecutor实例,用来执行listener中的任务。
    触发操作的执行过程:
    第一步addlistener():

    调用addlistener()方法后,DefaultPromise会调用静态方法notifyListener(),来执行listener中的操作。

    然后再看看notifyListenerWithStackOverFlowProtection()

    接下来的safeexecute()和notifylistener0()就很简单了

    completefuture类总结:
    1.conpletefuture中保存了eventexecutor的信息,用来执行listener中的任务。
    2.调用了future的addlistener()方法后,将listener中的操作封装成runnble任务扔到eventexecutor中的任务队列中等待执行
    3.completefuture表示已经完成异步操作,状态是isdone。
    (四)channelfuture
    这是一个继承future的接口,顾名思义,该接口与通道操作有关,所以在channelfuture接口中,除了覆盖future的功能外,只提供了一个channel()抽象方法。


    2楼2020-06-27 16:12
    回复
      2025-09-04 10:17:21
      广告
      不感兴趣
      开通SVIP免广告
      我这边有免费的Java技术干货和一些面试资料,零基础和架构方面的都有,有需要的朋友可以私聊我一下哦!


      3楼2020-06-27 16:13
      回复