文章目录
重要的参考文章,点击这里
从上面这里得出的总结:
- 1.Future接口中的方法都是getter方法而没有setter方法,也就是说这样实现的Future子类的状态是不可变的
- 2.Promise接口继承自Future接口,它提供的setter方法与常见的setter方法大为不同。Promise从Uncompleted–>Completed的状态转变有且只能有一次,也就是说setSuccess和setFailure方法最多只会成功一个,此外,在setSuccess和setFailure方法中会通知注册到其上的监听者。为了加深对Future和Promise的理解,我们可以将Future类比于定额发票,Promise类比于机打发票。当商户拿到税务局的发票时,如果是定额发票,则已经确定好金额是100还是50或其他,商户再也不能更改;如果是机打发票,商户相当于拿到了一个发票模板,需要多少金额按实际情况填到模板指定处。显然,不能两次使用同一张机打发票打印,这会使发票失效,而Promise做的更好,它使第二次调用setter方法失败。
当
方法的介绍
public interface Future<V> extends java.util.concurrent.Future<V> {
// I/O操作是否执行成功
boolean isSuccess();
// 标记是否可以通过下面的cancel(boolean mayInterruptIfRunning)取消I/O操作
boolean isCancellable();
// 返回I/O操作的异常实例 - 如果I/O操作本身是成功的,此方法返回null
Throwable cause();
// 为当前Future实例添加监听Future操作完成的监听器 - isDone()方法激活之后所有监听器实例会得到回调
Future<V> addListener(GenericFutureListener<? extends Future<? super V>> listener);
Future<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners);
// 为当前Future移除监听Future操作完成的监听器
Future<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener);
Future<V> removeListeners(GenericFutureListener<? extends Future<? super V>>... listeners);
// 同步等待Future完成得到最终结果(成功)或者抛出异常(失败),响应中断
Future<V> sync() throws InterruptedException;
// 同步等待Future完成得到最终结果(成功)或者抛出异常(失败),不响应中断
Future<V> syncUninterruptibly();
// 等待Future完成,响应中断
Future<V> await() throws InterruptedException;
// 等待Future完成,不响应中断
Future<V> awaitUninterruptibly();
// 带超时时限的等待Future完成,响应中断
boolean await(long timeout, TimeUnit unit) throws InterruptedException;
boolean await(long timeoutMillis) throws InterruptedException;
// 带超时时限的等待Future完成,不响应中断
boolean awaitUninterruptibly(long timeout, TimeUnit unit);
boolean awaitUninterruptibly(long timeoutMillis);
// 非阻塞马上返回Future的结果,如果Future未完成,此方法一定返回null;有些场景下如果Future成功获取到的结果是null则需要二次检查isDone()方法是否为true
V getNow();
// 取消当前Future实例的执行,如果取消成功会抛出CancellationException异常
@Override
boolean cancel(boolean mayInterruptIfRunning);
}