无法从自身获取的线程关闭执行程序

时间:2012-04-11 22:23:33

标签: java multithreading netty ning

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

背景

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

问题

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

这个类看起来基本上是一个用于结束Netty中线程的实用程序。

这个方法导致了我正在使用的Web客户端(由Ning提供支持)中的错误,因为我试图关闭该客户端响应的处理程序内的HttpClient。

问题

这段代码试图避免死锁的重要性是什么?有关详细信息,请参阅this code 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 个答案:

答案 0 :(得分:2)

在netty中,不允许从IO-Thread中关闭Executor(正如异常告诉你的那样;)),这是因为你有可能看到死锁。如果您真的想从处理程序中关闭Executor,则需要在新线程中执行它。例如:

public void messageReceived(...) {
    // in IO-Thread
    new Thread(new Runnable() {
        public void run() {
            //....shutdown here
        }
    }).start();
}