0
嗨,大家好:這個問題涉及到線程,客戶端,Netty和Ning。Executor無法從線程獲取自己的線程關閉
背景
寧庫是一個異步HTTP請求的工具,它使我們能夠建立請求,他們排隊,並異步處理它們。它依賴於一些庫,比如下面粘貼的JBoss/Netty代碼。
問題
我最近碰到這是由該位在JBoss/Netty的ExecutorUtil
類代碼拋出一個線程關閉例外跑。
這個類看起來基本上是一個在Netty中結束線程的工具。
這種方法在我使用的網絡客戶端(由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.");
}
}
}
線程的分離如何防止死鎖。我會想象,如果我們從外部線程調用close,則存在同樣的問題..?感謝您的回答。 – jayunit100 2012-04-12 11:53:50
Netty調用ExecutorService.shutdown()來終止當所有提交的任務完成時返回的執行程序。您不能關閉IO-Thread的執行程序,因爲ExecutorService.shutdown()將等待已調用shutdown的IO-Thread返回。結果是死鎖。諾曼的建議起作用,因爲新線程可以等待所有IO線程返回。 – johnstlr 2012-04-13 08:22:20