2009-03-31 7 views
5

Gibt es in Java 1.4 eine bessere Möglichkeit, die ID eines Threads zu erhalten als mit Thread.getName()?Erhalte die eindeutige ID eines Threads in Java 1.4

Ich meine, getName() in Unit Tests gibt so etwas wie "Thread-1" zurück, aber in WebLogic 10 bekomme ich "[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'.xml".

+0

Ok, wir brauchen noch ein paar Infos hier. Interessieren Sie sich für alle Threads oder nur für diejenigen, die Sie erstellen (klingt wie alle)? Benötigen Sie denselben Wert, der bei jedem Lauf der Komponententests zurückgegeben wird, oder kann der zurückgegebene Wert bei jedem Ausführen der Komponententests unterschiedlich sein? – TofuBeer

Antwort

8

Thread.getId (es kann theoretisch overflow, aber es ist nicht definiert und in der Praxis wird nicht).

1.5 läuft gerade durch das Ende der Nutzungsdauer, aber wenn Sie alte staubige 1.4 verwenden, können Sie Ihre eigene mit ThreadLocal implementieren. (Hinweis: Befolgen Sie die Java SE 6-API-Dokumentation nicht zu genau!)

+0

Das ist nur die Implementierung von Sun, aber es könnte geändert werden, nicht einfach zu ++ und tatsächlich aggressiv bei der Wiederverwendung. Die Wahrscheinlichkeit, dass dies passiert, ist wahrscheinlich gering, und die Wahrscheinlichkeit einer anderen Implementierung, sagen wir dem Classpath-Projekt, ist mit einer anderen Methode gering. – TofuBeer

+0

Classpath (ist es noch nicht tot) und Harmony könnte eine andere, ungeheuerlich nicht konforme Implementierung verwenden, aber in der Praxis ist das nur eine theoretische Möglichkeit. –

+0

@Tom Hawtin: Aber die API-Dokumentation besagt ausdrücklich: "Wenn ein Thread beendet wird, kann diese Thread-ID wiederverwendet werden." –

2

Sie können getID verwenden, wenn Sie JDK 1.5 oder höher verwenden.

Ist es erforderlich, dass Sie für jedes Mal, wenn Sie die Komponententests ausführen, einen konsistenten Wert benötigen oder nur ein eindeutiger Wert gut genug ist?

3

Warum brauchen Sie das? Denn abhängig von Ihrer Antwort gibt es mehrere Ansätze.

Erstens, verstehen Sie, dass der Name eines Threads nicht garantiert eindeutig ist. Es gibt auch keinen Identitätshashcode.

Wenn Sie wirklich eine eindeutige ID mit einem Thread verknüpfen möchten, müssen Sie dies selbst tun. Wahrscheinlich mit einer IdentityHashMap. Dies führt jedoch zu einer starken Referenz, auf die Sie in einer Produktions-App nicht verzichten möchten.

Edit: TofuBeer hat eine Lösung, die wahrscheinlich besser ist, obwohl die Dokumente merken, dass Thread-IDs wiederverwendet werden können.

3

Wie in "Thread.getId() global uniqueness question" Frage SO erwähnt, und durch den Quellcode Thread.java bestätigt:

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

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

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

Der Thread-ID sehr einfach ist, sich selbst zu implementieren, wenn Ihr noch in java1.4 sind.
Diese Implementierung bedeutet jedoch, dass ein bestimmter Thread nicht die gleiche ID hat, wenn Sie Ihr Programm mehrmals ausführen.
Also je nachdem, was Sie benötigen, können Sie eine Namenspolitik, die beide sind implementieren müssen:

  • einzigartig für eine bestimmte Laufzeit Sitzung
  • von Sitzung zu Sitzung mit dem internen Original verknüpft wiederverwendet
  • noch Namensrichtlinie, die von der 1.4 JVM verwaltet wird ("Thread-1", "Thread-2", ...)