cindy源码阅读(6)future

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

其实用到future的地方还是挺少的,就是session的开始 结束 和发送数据。
session的开始 结束其实对socket的处理,剩下的事情就交给ractor了,发送数据也是添加到一个sendquene,剩下的事情也是交给别人做了。
[img]http://dl.iteye.com/upload/attachment/0084/2825/34f6f91f-bf72-3940-8b59-50e5ac9ef8c8.png[/img]

可以看到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的主要地方:

[img]http://dl.iteye.com/upload/attachment/0084/2846/840dfc65-d1c1-3d04-89c0-db4122b2165e.png[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值