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的主要地方: