Исполнитель не может быть отключен от полученной от Нити Нити

Привет, ребята: Этот вопрос касается потоков, клиентов, Нетти и Нина.

КОНТЕКСТ

Библиотека Ning - это инструмент асинхронного HTTP-запроса, который позволяет нам создавать запросы, ставить их в очередь и обрабатывать их асинхронно. Он опирается на некоторые библиотеки, такие как код JBoss/Netty, вставленный ниже.

ПРОБЛЕМА

Недавно я наткнулся на исключение закрытия потока, которое было выдано этим фрагментом кода в JBoss/Netty ExecutorUtil учебный класс.

Этот класс, по-видимому, по сути является утилитой для завершения потоков в Netty.

Этот метод вызывал ошибку в веб-клиенте (работающем от Ning), который я использовал, из-за того, что я пытался закрыть HttpClient внутри обработчика для ответа этого клиента.

Вопрос

Каково значение тупика, который пытается избежать этот блок кода? Для получения дополнительной информации, класс можно увидеть по этому адресу URL.

// Check dead lock.
    final Executor currentParent = DeadLockProofWorker.PARENT.get();
    if (currentParent != null) {
        for (Executor e: executorsCopy) {
            if (e == currentParent) {
                throw new IllegalStateException(
                        "An Executor cannot be shut down from the thread " +
                        "acquired from itself.  Please make sure you are " +
                        "not calling releaseExternalResources() from an " +
                        "I/O worker thread.");
            }
        }
    }

1 ответ

В netty вам не разрешено выключать Executor из IO-Thread (как уже говорит вам исключение;)), это потому, что вы рискуете увидеть тупик. Если вы действительно хотите закрыть Executor из обработчика, вам нужно сделать это в новом потоке. Что-то вроде например:

public void messageReceived(...) {
    // in IO-Thread
    new Thread(new Runnable() {
        public void run() {
            //....shutdown here
        }
    }).start();
}
Другие вопросы по тегам