2012-04-11 9 views
0

こんにちは。スレッド、クライアント、Netty、およびNingが関係します。実行者は自分自身から取得したスレッドからシャットダウンできません

CONTEXT

寧ライブラリは、私たちは、リクエストを構築し、それらをキューに入れて、非同期的にそれらを処理することを可能にする非同期HTTPリクエストツールです。下に貼り付けられたJBoss/Nettyコードなど、いくつかのライブラリに依存しています。私は最近のJBoss /網状ExecutorUtilクラスのコードのこのビットによってスローされた例外を閉じるスレッド間で走っ

PROBLEM

このクラスは、本質的に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."); 
      } 
     } 
    } 

答えて

2

(例外はすでにあなたを語っているよう;)あなたは、IO-スレッド内からシャットダウンに執行を許可されていません)を使用すると、デッドロックを参照してくださいする危険性を持ってしまうので、これはです。エグゼキュータをハンドラ内からシャットダウンする場合は、新しいスレッドで実行する必要があります。たとえば、次のようなものがあります。

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

デッドロックを防ぐ方法はありますか。私は外部スレッドからcloseを呼び出すと同じ問題が存在すると思います。ご回答有難うございます。 – jayunit100

+1

NettyはExecutorService.shutdown()を呼び出して、実行されたすべてのタスクが終了したときに戻るexecutorを終了します。 ExecutorService.shutdown()は、シャットダウンを呼び出すIOスレッドが戻るのを待つため、実行スレッドをIOスレッドからシャットダウンすることはできません。結果はデッドロックです。ノーマンの提案は、新しいスレッドがすべてのIOスレッドが返るまで自由に待つことができるため、機能します。 – johnstlr

関連する問題