2012-04-11 43 views
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."); 
      } 
     } 
    } 

回答

2

在網狀你不準關機從IO線程內的執行人(如異常是告訴你了;)),這是因爲你將不得不看到一個死鎖的風險。如果你真的想從一個處理程序中關閉Executor,你需要在一個新的線程中完成它。例如:

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

線程的分離如何防止死鎖。我會想象,如果我們從外部線程調用close,則存在同樣的問題..?感謝您的回答。 – jayunit100 2012-04-12 11:53:50

+1

Netty調用ExecutorService.shutdown()來終止當所有提交的任務完成時返回的執行程序。您不能關閉IO-Thread的執行程序,因爲ExecutorService.shutdown()將等待已調用shutdown的IO-Thread返回。結果是死鎖。諾曼的建議起作用,因爲新線程可以等待所有IO線程返回。 – johnstlr 2012-04-13 08:22:20