2013-05-23 5 views
5

Warum gibt z. B. Thread.currentThread().getId() eine lange zurück?Rückgabetyp von getId() für ein Thread-Objekt

Muss das wirklich 64 Bits sein? Wie ich werde jemals eine Maschine haben, die diese Anzahl von Threads laufen lässt!

Ernsthaft, es ist ein bisschen ein Schmerz, da ich etwas schreibe, das eine Spur von Thread-Bezeichnern zusammen mit anderen Bits behält, und ich würde wirklich lieber nicht eine so lange Nummer verwenden müssen, sonst den eindeutigen Schlüssel, den ich habe zu erzeugen ist enorm.

Vielleicht gibt es eine Konvention über die lange Rückkehr; wie die ersten 48 Bits sind immer Null. Ich hatte eine Ausgrabung im Internet, habe aber nichts gefunden. Ich hoffe es; Weiß jemand das sicher?

Danke.

+0

Nr getId() wird wahrscheinlich eine Kennung des zugrunde liegenden Betriebssystem zurückkehren, so dass Sie genau Null Garantien auf den Wert. –

+0

Es scheint eine gute Idee zu sein, für die Zukunft zu planen und eine wirklich große Anzahl von Threads zuzulassen. – Keppil

+0

Weil das so ist. Sie haben den Fall übersehen, bei dem wirklich ein 64-Bit-Zeiger * zurückgegeben wird. Nicht konstruktiv. – EJP

Antwort

6

Dieser Code:

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

sollte Einblick geben, warum. Im Wesentlichen werden Thread-IDs durch einen laufenden Zähler zugewiesen. Wenn Sie Ihre JVM nicht für eine signifikante Zeitspanne beenden, würde diese Zahl über die Länge gehen. Ich kann mir nur vorstellen, dass sie es getan haben, um die Wahrscheinlichkeit von Kollisionen in langen laufenden Threads zu reduzieren.

+0

Danke für diese Erklärung +1 und akzeptieren in ein paar Minuten. Werde ich hier allein denken, dass das ein bisschen vulgär ist? – Bathsheba

+0

@Bathsheba meine Antwort ist vulgär? – Woot4Moo

+0

Nein, es ist perfekt. Das Konzept, eine Nummer so groß zu machen, dass wir uns nicht um den Fehler kümmern müssen, ist vulgär, imo. – Bathsheba

1

Java-Anwendungen sind im Vergleich zu anderen Java-Anwendungen sandboxed, was bedeutet, dass Thread-IDs wahrscheinlich kollidieren.

Threads sind nicht für alle Anwendungen eindeutig, sie sind nur für jede Anwendung eindeutig. Mit Blick auf die Thread.init Methode in der Quelle, können Sie finden:

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

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

Ich denke, es verwendet einen potentiellen Überlauf Fehler zu verhindern. Wenn Threads erstellt werden, würde die Nummer schließlich überlaufen. Lange wird nur

9223372036854775807(Max long value) - 2147483647(Max int value) = 9.223372e+18 

ein bisschen mehr sicher :)

Verwandte Themen