Из ChannelFutureListener документы:
GenericFutureListener.operationComplete (Future) напрямую вызывается потоком ввода-вывода
Я читаю netty 4.1.22. Окончательный исходный код.Похоже, что GenericFutureListener.operationComplete может быть выполнен в потоке ( поток без ввода-вывода ), вызывая addListeners (), пока событие завершено, но прослушиватель не был вызван.
// source code of DefaultPromise#addListeners()
@Override
public Promise<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners) {
checkNotNull(listeners, "listeners");
synchronized (this) {
for (GenericFutureListener<? extends Future<? super V>> listener : listeners) {
if (listener == null) {
break;
}
addListener0(listener);
}
}
if (isDone()) {
notifyListeners(); // if called
}
return this;
}
// source code of DefaultPromise#notifyListeners()
private void notifyListeners() {
EventExecutor executor = executor();
if (executor.inEventLoop()) {
final InternalThreadLocalMap threadLocals = InternalThreadLocalMap.get();
final int stackDepth = threadLocals.futureListenerStackDepth();
if (stackDepth < MAX_LISTENER_STACK_DEPTH) {
threadLocals.setFutureListenerStackDepth(stackDepth + 1);
try {
notifyListenersNow(); // if called
} finally {
threadLocals.setFutureListenerStackDepth(stackDepth);
}
return;
}
}
safeExecute(executor, new Runnable() {
@Override
public void run() {
notifyListenersNow();
}
});
}