cindy源码阅读(6)future

future的本质就是事情交给别人来做,不管别人有没有做完,马上返回。

其实用到future的地方还是挺少的,就是session的开始 结束 和发送数据。
session的开始 结束其实对socket的处理,剩下的事情就交给ractor了,发送数据也是添加到一个sendquene,剩下的事情也是交给别人做了。


可以看到cindy的future类似jdk的future,但是多了个getSession的功能。

那为什么需要getSession的功能呢。因为future会有一些FutureListener,当future处于不同状态的时候触发FutureListener,而FutureListener的具体实现其实还是对session的操作。

可以看到future的实现类只有一个:DefaultFuture。所以分析起来还是比较容易的。

主要的字段是
  private volatile Queue listeners; // lazy load

    private volatile boolean completed = false;
    private volatile boolean succeeded = false;


先说listeners,很明显可以添加删除listener,但是什么时候触发listener呢?是在setSucceeded方法中,会执行。
 private void futureCompleted(FutureListener listener) {
                try {
                    listener.futureCompleted(DefaultFuture.this);
                } catch (Throwable e) {
                    caughtException(e);
                }
            }

其实看到FutureListener接口只有futureCompleted这一个方法。

然后是completed 和succeeded 字段。setSucceeded的时候会设置completed 为true,也会设置succeeded 为对应值。
 public synchronized void setSucceeded(boolean succeeded) {
        if (completed)
            throw new IllegalStateException(
                    "can't change the state of a completed future");
        completed = true;
        this.succeeded = succeeded;

        notifyAll();

        dispatchFutureCompleted(null);
    }


然后构造方法也是可以设置这两个字段的。

 
public DefaultFuture(Session session, boolean succeeded) {
        this.session = session;
        completed = true;
        this.succeeded = succeeded;
    }

DefaultFuture的构造方法的形式一般用于直接返回:Session 的startFuture, closeFuture有用到。抛出异常的时候也也一般是这样。


用到future的主要地方:



猜你喜欢

转载自huangyunbin.iteye.com/blog/1867020
今日推荐