Java 1.4 でスレッドの一意の識別子を取得する
-
22-08-2019 - |
質問
Java 1.4 では、スレッドの ID を取得するためのより良い方法はありますか? Thread.getName()
?
つまり、 getName()
単体テストでは次のようなものが返されます "Thread-1"
, 、しかしWebLogic 10では、 "[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'.xml"
.
解決
Thread.getId (理論的には可能です オーバーフロー, 、しかし、そうではないように定義されており、実際にはそうではありません)。
1.5 は現在サービス終了期間を迎えていますが、古い Dusty-decks 1.4 を使用している場合は、次のコマンドを使用して独自のデッキを実装できます。 ThreadLocal
. 。(Java SE 6 API ドキュメントにあまり厳密に従いすぎないように注意してください。)
他のヒント
なぜあなたはこれを必要なのですか?あなたの答えに依存しているため、いくつかの方法があります。
まず、スレッドの名前は一意であることが保証されていないことを理解しています。 NORアイデンティティハッシュコードです。
あなたは本当にスレッドに固有のIDを関連付けたい場合は、あなたはそれを自分で行う必要があるとしています。おそらくのIdentityHashMapを使用しました。しかし、それはあなたが生産アプリでぶらぶらしているにしたくないという強い参照を紹介します。
編集:TofuBeerは、ドキュメントは、スレッドIDは再利用できることに注意しますが、おそらく良いでしょう解決策を持っている。
」でも述べたように、Thread.getId() のグローバルな一意性に関する質問「SO質問、ソースコードで確認済み」 スレッド.java:
/* For generating thread ID */
private static long threadSeqNumber;
/* Set thread ID */
tid = nextThreadID();
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
まだ Java1.4 を使用している場合、スレッド ID を自分で実装するのは非常に簡単です。
ただし、この実装は、プログラムを複数回実行するときに、特定のスレッドが同じ ID を持たなくなることを意味します。
したがって、必要に応じて、次の両方の名前付けポリシーを実装する必要がある場合があります。
- 特定のランタイムセッションに固有
- セッション間で再利用される
- 1.4 JVM によって管理される内部の元の名前付けポリシー (「Thread-1」、「Thread-2」、...) にまだリンクされています。
あなたはを使用することができますgetId のあなたはJDK 1.5以上である場合。
それはあなたがユニットテストを実行するか、十分に良いだけのユニークな値であるたびに一貫した値が必要な場合ですか?