6、看!源码之netty中future之最终篇
2019-01-30 本文已影响0人
starskye
Future最终篇
之间讲了很多的Future实现,这里将会讲述最后的实现,实现还有很多但是有些个实现并没有可讲的单独拿来说比较抽象,此处就不再进行讲解了,在具体使用的时候在进行讲解如DefaultChannelPromise实现和他的子类实现,DelegatingChannelPromiseNotifier是委托类此类还实现了监听器接口,内部并没有特别实现这里也不进行讲解了。
public interface ProgressivePromise<V> extends Promise<V>, ProgressiveFuture<V> {
//设置进度,如果设置参数有误或者当前任务已经执行结束则会抛出异常
ProgressivePromise<V> setProgress(long progress, long total);
//设置进度,如果设置参数有误或者当前任务已经执行结束则会返回false
boolean tryProgress(long progress, long total);
//剩余其他方法都是继承与父类并无可讲之处
}
//默认的进度future实现
public class DefaultProgressivePromise<V> extends DefaultPromise<V> implements ProgressivePromise<V> {
//构造器传入一个执行器
public DefaultProgressivePromise(EventExecutor executor) {
super(executor);
}
protected DefaultProgressivePromise() { /* only for subclasses */ }
//设置进度,上方接口定义的实现方法。
@Override
public ProgressivePromise<V> setProgress(long progress, long total) {
//如果传入的总进度小于0
if (total < 0) {
// 则设置为-1,代表未知进度
total = -1;
//如果设置的当前进度也小于0则抛出异常
if (progress < 0) {
throw new IllegalArgumentException("progress: " + progress + " (expected: >= 0)");
}
//如果总进度大于0 但是 设置的进度小于0 或者 设置进度大于总进度 则抛出异常
} else if (progress < 0 || progress > total) {
throw new IllegalArgumentException(
"progress: " + progress + " (expected: 0 <= progress <= total (" + total + "))");
}
//如果当前任务已经执行完成则抛出异常
if (isDone()) {
throw new IllegalStateException("complete already");
}
//否则进行通知进度监听器
notifyProgressiveListeners(progress, total);
return this;
}
//尝试设置进度
@Override
public boolean tryProgress(long progress, long total) {
//总进度小于0
if (total < 0) {
total = -1;//与上方定义一样
//判断设置的当前进度是否小于0 或者 当前任务是否已经完成如果两者满足其一则返回false
if (progress < 0 || isDone()) {
return false;
}
//如果设置的进度小于0 或者 设置进度大于总进度 或者 当前任务已经执行完成则返回false
} else if (progress < 0 || progress > total || isDone()) {
return false;
}
//否则进行通知进度监听器并且返回true
notifyProgressiveListeners(progress, total);
return true;
}
//其他方法都是对父类的调用并没有什么可描述的这里就不在重复讲述
}
剩下的定义与实现:ChannelProgressiveFuture 特殊定义用于传输进度,ChannelProgressivePromise 特殊的定义用于字节传输时继承与ChannelProgressiveFuture ,ImmediateProgressivePromise 立即执行唯一实现是将死锁检查方法给去除了,具体在使用时在进行介绍,DefaultChannelProgressivePromise继承与DefaultProgressivePromise并没有特殊的处理都是采用的父类实现的方法,到此netty中的future基本完结,接下来讲解监听器,因为在讲future的时候内部使用了很多监听器。