2009-03-31 15 views
5

Java 1.4では、Thread.getName()を使用するよりもスレッドIDを取得する方法がありますか?Java 1.4でスレッドの一意の識別子を取得

ユニットテストのgetName()"Thread-1"のようになりますが、WebLogic 10では"[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'.xml"が返されます。

+0

Okここではさらに詳しい情報が必要です。あなたはすべてのスレッドに興味がありますか、あなたが作成するスレッドだけに興味がありますか?単体テストを実行するたびに同じ値が返される必要がありますか、単体テストの実行ごとに戻り値が異なることはありますか? – TofuBeer

答えて

8

Thread.getId(理論的にはoverflowでも構いませんが、実際にはそうではありません)。

1.5は現在使用期限が終了していますが、古いダストデッキ1.4を使用している場合は、ThreadLocalで自分自身を実装することができます。

+0

これはSunの実装にすぎませんが、単に++に変更するだけでなく、実際には再使用時に積極的に変更することができます。そのようなことの確率は低い可能性があり、クラスパスプロジェクトのように、異なる実装方法を使用することで、異なる方法を使用することは稀です。 – TofuBeer

+0

クラスパス(まだ死んではいません)、Harmonyは違う、まったく違反する実装を使うことができますが、実際には理論的な可能性しかありません。 –

+0

@Tom Hawtin:しかし、APIドキュメントでは、「スレッドが終了すると、このスレッドIDが再利用される可能性があります。 –

2

JDK 1.5以上を使用している場合は、getIDを使用することができます(詳しくは、Java SE 6 APIのドキュメントをあまり詳しくお読みください)。

単体テストを実行するたびに一貫した値が必要なのか、それとも一意の値だけで十分でしょうか?

3

なぜこれが必要ですか?あなたの答えに応じて、いくつかのアプローチがあります。

まず、スレッドの名前が一意であるとは限りません。アイデンティティハッシュコードもそうではありません。

本当にスレッドに一意のIDを関連付ける場合は、自分で行う必要があります。 IdentityHashMapを使用している可能性があります。しかし、それはあなたが生産用アプリにぶらぶらしたくないという強い参照を導入するでしょう。

編集:TofuBeerには、スレッドIDを再利用できることが書かれていますが、TofuBeerの方が優れているはずです。

3

Thread.getId() global uniqueness question」SO質問、およびThread.javaのソースコードによって確認で述べたように:

/* For generating thread ID */ 
private static long threadSeqNumber; 

/* Set thread ID */ 
tid = nextThreadID(); 

private static synchronized long nextThreadID() { 
    return ++threadSeqNumber; 
} 

スレッドIDは、あなたがjava1.4に残っている場合は、自分自身を実装することは非常に簡単です。
しかし、この実装では、プログラムを何度も実行しているときに、特定のスレッドが同じIDを持たないことを意味します。
ですから、両方で命名ポリシーを実装する必要があり、何が必要に応じて:まだ内部元にリンク

    セッションに与えられた実行時のセッションのセッションから再利用
  • のためのユニークな
  • 1.4 JVM( "Thread-1"、 "Thread-2"、...)によって管理される名前付けポリシー
関連する問題