может GenericFutureListener.operationComplete быть выполненным потоком не-IO в netty - PullRequest
0 голосов
/ 02 октября 2018

Из 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();
        }
    });
}

1 Ответ

0 голосов
/ 04 октября 2018

Он всегда будет выполняться EventExecutor, который использовался для создания DefaultPromise.EventLoop является подтипом EventExecutor и в большинстве случаев используется для создания такого DefaultPromise.

...