こんにちは。スレッド、クライアント、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.");
}
}
}
デッドロックを防ぐ方法はありますか。私は外部スレッドからcloseを呼び出すと同じ問題が存在すると思います。ご回答有難うございます。 – jayunit100
NettyはExecutorService.shutdown()を呼び出して、実行されたすべてのタスクが終了したときに戻るexecutorを終了します。 ExecutorService.shutdown()は、シャットダウンを呼び出すIOスレッドが戻るのを待つため、実行スレッドをIOスレッドからシャットダウンすることはできません。結果はデッドロックです。ノーマンの提案は、新しいスレッドがすべてのIOスレッドが返るまで自由に待つことができるため、機能します。 – johnstlr