0

大家好:这个问题涉及线程、客户端、Netty 和 Ning。

语境

Ning 库是一个异步 HTTP 请求工具,它允许我们构建请求、对它们进行排队和异步处理它们。它依赖于一些库,例如下面粘贴的 JBoss/Netty 代码。

问题

ExecutorUtil我最近遇到了一个线程关闭异常,它是由 JBoss/Netty类中的这段代码引发的。

此类似乎本质上是用于在 Netty 中结束线程的实用程序。

这种方法导致我正在使用的 Web 客户端(由 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.");
            }
        }
    }
4

1 回答 1

2

在 netty 中,您不允许从 IO-Thread 中关闭 Executor(因为异常已经告诉您 ;)),这是因为您有看到死锁的风险。如果您真的想从处理程序中关闭执行程序,则需要在新线程中执行此操作。例如:

public void messageReceived(...) {
    // in IO-Thread
    new Thread(new Runnable() {
        public void run() {
            //....shutdown here
        }
    }).start();
}
于 2012-04-12T05:50:52.280 回答