归档
Netty-异步工具类
异步结果
接口
io.netty.util.concurrent.Future
public interface Future<V> extends java.util.concurrent.Future<V> {
boolean isSuccess();
boolean isCancellable();
Throwable cause();
Future<V> addListener(GenericFutureListener<? extends Future<? super V>> listener);
Future<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener);
Future<V> sync() throws InterruptedException;
Future<V> syncUninterruptibly();
...
}
io.netty.util.concurrent.Promise
public interface Promise<V> extends Future<V> {
Promise<V> setSuccess(V result);
boolean trySuccess(V result);
Promise<V> setFailure(Throwable cause);
boolean tryFailure(Throwable cause);
boolean setUncancellable();
}
io.netty.channel.ChannelFuture
public interface ChannelFuture extends Future<Void> {
Channel channel();
boolean isVoid();
}
io.netty.channel.ChannelPromise
public interface ChannelPromise extends ChannelFuture, Promise<Void> {
ChannelPromise setSuccess();
boolean trySuccess();
ChannelPromise unvoid();
}
实现类
DefaultChannelPromise
public class DefaultChannelPromise extends DefaultPromise<Void> implements ChannelPromise, FlushCheckpoint {
private final Channel channel;
private long checkpoint;
@Override
protected EventExecutor executor() {
EventExecutor e = super.executor();
if (e == null) {
return channel().eventLoop();
} else {
return e;
}
}
@Override
public ChannelPromise setSuccess() {
return setSuccess(null);
}
@Override
public ChannelPromise setSuccess(Void result) {
super.setSuccess(result);
return this;
}
}
DefaultPromise
public class DefaultPromise<V> extends AbstractFuture<V> implements Promise<V> {
@Override
public Promise<V> setSuccess(V result) {
if (setSuccess0(result)) {
return this;
}
throw new IllegalStateException("complete already: " + this);
}
private boolean setSuccess0(V result) {
return setValue0(result == null ? SUCCESS : 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;
}
private synchronized boolean checkNotifyWaiters() {
if (waiters > 0) {
notifyAll();
}
return listener != null || listeners != null;
}
private void notifyListeners() {
EventExecutor executor = executor();
if (executor.inEventLoop()) {
...
notifyListenersNow();
...
return;
...
}
safeExecute(executor, new Runnable() {
@Override
public void run() {
notifyListenersNow();
}
});
}
private static void safeExecute(EventExecutor executor, Runnable task) {
try {
executor.execute(task);
} catch (Throwable t) {
...
}
}
private void notifyListenersNow() {
GenericFutureListener listener;
DefaultFutureListeners listeners;
...
for (;;) {
if (listener != null) {
notifyListener0(this, listener);
} else {
notifyListeners0(listeners);
}
synchronized (this) {
if (this.listener == null && this.listeners == null) {
...
return;
}
listener = this.listener;
listeners = this.listeners;
if (listener != null) {
this.listener = null;
} else {
this.listeners = null;
}
}
}
}
private void notifyListeners0(DefaultFutureListeners listeners) {
GenericFutureListener<?>[] a = listeners.listeners();
int size = listeners.size();
for (int i = 0; i < size; i ++) {
notifyListener0(this, a[i]);
}
}
private static void notifyListener0(Future future, GenericFutureListener l) {
try {
l.operationComplete(future);
} catch (Throwable t) {
...
}
}
}
监听器
GenericFutureListener
public interface GenericFutureListener<F extends Future<?>> extends EventListener {
void operationComplete(F future) throws Exception;
}
执行器
NioEventLoop