2011-04-03 1 views
5

ソケットを使用するマルチスレッドクライアントサーバーアプリケーションがあります。新しい接続が見つかると、新しいExecutorsスレッドプールを使用して新しいスレッドにさらに実行が転送されます。Thread.setName(name)の警告

そのクライアントのすべてのロギングステートメントにクライアントIDを記録します。問題は、クライアントIDを渡すだけでメソッドシグネチャを変更したくないということです。私が考え

解決策は以下のとおりです。

  1. クライアント値を保持するためにThreadLocalを使用しました。
  2. run()では、Thread.currentThread()。setName(clientId);を使用してクライアントIDをThreadに設定できます。

最初に動作するはずです。しかし、私は第二の選択肢が好きです。 です。デバッガからクライアントIDを見つけることができます b。ロガーライブラリは、スレッド名を表示するように設定できます。したがって、ログステートメントに変更は必要なく、ライブラリ内のロガーでも機能します。

javadocに記載されているものとは別に、thread.setName()を使用する際の注意点は何ですか?パフォーマンスにはどのような影響がありますか?呼び出し元のthread.setName()のピーク頻度は、毎秒約200回、平均約0.3回/秒です。

答えて

3

Log4jを使用している場合、このタイプのロギングパターンを処理する特定のメカニズムがあり、2つのクラスorg.apache.log4j.NDCorg.apache.log4j.MDC( 'Nested and Mapped Diagnostic Contexts')に分割されています。

NDC vs MDC - Which one should I use?を参照して、特定の状況に最適なものを確認してください。

ここでは、もう少し実用的な詳細にMDCの使用について説明し、別のリンクです:基礎となるストレージ・メカニズムMDC/NDCの用途は(私は信じて)とにかくThreadLocalのあることBuild Flexible Logs With log4j - O'Reilly Media

注意。

+0

これはきれいです。私はそれを試してみます。ありがとう! – Dojo

1

開発したソフトウェア(printserver)で2番目の方法を使用しますが、スレッドの実行時間が長くなるため、 "setName()"は処理に遅延を追加しません。 ログフェーズはスレッド名を示す非常に良いです。私は "のsetName()が" 2ケースでproblemaだと思う

  1. 非常に短期的;
  2. 異なるIDを持つより多くのアクターがスレッドを使用します(ただし、これはあなたのコンテキストではありませんか?)。

bye。

+0

入力いただきありがとうございます@ m.genova – Dojo

2

javadocに記載されているものとは別に、thread.setName()を使用する際の注意点は何ですか?パフォーマンスにはどのような影響がありますか?呼び出し元のthread.setName()のピーク頻度は、毎秒約200回、平均約0.3回/秒です。

パフォーマンスは重要な問題ではありません。 Thread.setName()はセキュリティチェックを行い、次に属性をコピー/設定します。コードがThread.setName()メソッドへの特権のない呼び出しを禁止するセキュリティサンドボックスで実行されている特権コードでない限り、セキュリティチェックは安価です。

私が考えることができる唯一の他の注意点は、スレッドの振る舞いをデバッグしようとすると、スレッド名が常に変化することが混乱する可能性があることです。例えばスレッドダンプなどを見てください。

+0

ええ、私はテスト中に大きなオーバーヘッドに気づいていませんでした。 – Dojo