大家好:这个问题涉及线程,客户,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.");
}
}
}
答案 0 :(得分:2)
在netty中,不允许从IO-Thread中关闭Executor(正如异常告诉你的那样;)),这是因为你有可能看到死锁。如果您真的想从处理程序中关闭Executor,则需要在新线程中执行它。例如:
public void messageReceived(...) {
// in IO-Thread
new Thread(new Runnable() {
public void run() {
//....shutdown here
}
}).start();
}