Netty--Future和Promise
目錄
?
概述
JDK.Future
Netty.Future
ChannelFuture
Promise
繼承關(guān)系
源碼分析
AbstractFuture
CompleteFuture
DefaultPromise
概述
Future代表了異步操作的結(jié)果,Netty的Future對(duì)JDK的Future進(jìn)行了擴(kuò)展。
JDK.Future
僅定義了是否完成以及是否取消的狀態(tài)判斷以及get方法。
public interface Future<V> {boolean cancel(boolean mayInterruptIfRunning);boolean isCancelled();boolean isDone();V get() throws InterruptedException, ExecutionException;V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }Netty.Future
增加了:
- 結(jié)果狀態(tài)
- 監(jiān)聽器管理
- sync
- await
ChannelFuture
增加了相關(guān)channel信息。
狀態(tài)信息:
public interface ChannelFuture extends Future<Void> {Channel channel();boolean isVoid(); }Promise
Promise相對(duì)Future增加了設(shè)置狀態(tài)的方法。
public interface Promise<V> extends Future<V> {//設(shè)置操作狀態(tài)方法Promise<V> setSuccess(V result);boolean trySuccess(V result);Promise<V> setFailure(Throwable cause);boolean tryFailure(Throwable cause);boolean setUncancellable();@OverridePromise<V> addListener(GenericFutureListener<? extends Future<? super V>> listener);@OverridePromise<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners);@OverridePromise<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener);@OverridePromise<V> removeListeners(GenericFutureListener<? extends Future<? super V>>... listeners);@OverridePromise<V> await() throws InterruptedException;@OverridePromise<V> awaitUninterruptibly();@OverridePromise<V> sync() throws InterruptedException;@OverridePromise<V> syncUninterruptibly(); }繼承關(guān)系
源碼分析
AbstractFuture<V>
get()方法調(diào)用await()方法。
public abstract class AbstractFuture<V> implements Future<V> {@Overridepublic V get() throws InterruptedException, ExecutionException {await();Throwable cause = cause();if (cause == null) {return getNow();}if (cause instanceof CancellationException) {throw (CancellationException) cause;}throw new ExecutionException(cause);}@Overridepublic V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {if (await(timeout, unit)) {Throwable cause = cause();if (cause == null) {return getNow();}if (cause instanceof CancellationException) {throw (CancellationException) cause;}throw new ExecutionException(cause);}throw new TimeoutException();} }CompleteFuture<V>
代表一個(gè)Future已經(jīng)完成。
內(nèi)部包含一個(gè)EventExecutor,用于注冊(cè)事件監(jiān)聽器
public abstract class CompleteFuture<V> extends AbstractFuture<V> {private final EventExecutor executor;protected CompleteFuture(EventExecutor executor) {this.executor = executor;}@Overridepublic Future<V> addListener(GenericFutureListener<? extends Future<? super V>> listener) {if (listener == null) {throw new NullPointerException("listener");}DefaultPromise.notifyListener(executor(), this, listener);return this;}@Overridepublic Future<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners) {if (listeners == null) {throw new NullPointerException("listeners");}for (GenericFutureListener<? extends Future<? super V>> l: listeners) {if (l == null) {break;}DefaultPromise.notifyListener(executor(), this, l);}return this;} }DefaultPromise<V>
設(shè)置狀態(tài)內(nèi)部使用了一個(gè)AtomicReferenceFieldUpdater
??? private static final AtomicReferenceFieldUpdater<DefaultPromise, Object> RESULT_UPDATER =
??????????? AtomicReferenceFieldUpdater.newUpdater(DefaultPromise.class, Object.class, "result");
??
? private boolean setValue0(Object objResult) {
??????? if (RESULT_UPDATER.compareAndSet(this, null, objResult) ||
??????????? RESULT_UPDATER.compareAndSet(this, UNCANCELLABLE, objResult)) {
??????????? if (checkNotifyWaiters()) {
??????????????? notifyListeners();
??????????? }
??????????? return true;
??????? }
??????? return false;
??? }
?
總結(jié)
以上是生活随笔為你收集整理的Netty--Future和Promise的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Netty--ByteBuf
- 下一篇: Netty--ChannelHandle