2009-08-11 7 views
4

Ich arbeite an einer gegenseitigen Ausschluss-Zuweisung, aber als ich gestartet habe, bemerkte ich, dass die Thread-ID meiner Anwendung bei 9 beginnt. Sie ändert sich nicht, wenn ich sie kompiliere und erneut ausführe. Gibt es ein Problem, das ich vermisse, oder können Java-Thread-IDs bei einer beliebigen Nummer beginnen? This question ist verwandt.Sollen Java Thread IDs immer bei 0 beginnen?


Für Interessenten, hier ist eine Klasse von Herlihy & Shavit "The Art of Multi-Prozessor-Programmierung" für die Nummerierung-Themen:

public class ThreadID { 
    private static volatile int nextID = 0; 
    private static class ThreadLocalID extends ThreadLocal<Integer> { 
     protected synchronized Integer initialValue() { 
      return nextID++; 
     } 
    } 

    private static ThreadLocalID threadID = new ThreadLocalID(); 
    public static int get() { 
     return threadID.get(); 
    } 
    public static void set(int index) { 
     threadID.set(index); 
    } 
} 

können Sie rufen dann

ThreadID.get(); 

denen nummeriert automatisch und beginnt immer bei 1.

Antwort

7

F rom die Thread#getId() Dokumentation:

Gibt die Kennung dieses Thema. Die Thread-ID ist eine positive lange Nummer generiert, wenn dieser Thread erstellt wurde. Die Thread-ID ist eindeutig und bleibt während ihrer Lebensdauer unverändert. Wenn ein Thread beendet wird, kann diese Thread-ID wiederverwendet werden.

Nichts zeigt an, dass es bei 0 beginnen werde ich würde vermuten, dass intern gewährleistet ist, Java mehr Thread-Objekte vor dem ersten macht, die Sie erstellen und damit der Thread-IDs 0 – 8 bereits belegt sind. Nichts in der Dokumentation garantiert jedoch, dass diese Nummer in irgendeiner Weise sequenziell ist (obwohl es derzeit implementiert ist), also sollten Sie nicht darauf angewiesen sein.

0

Ich weiß nicht, ob es eine Spezifikation gibt, die dies definiert, oder wie zuverlässig oder konsistent diese Nummerierung sein wird, aber die Threads, die Sie in Ihrem Code erstellen, sind nicht die ersten laufenden Threads im System, eine Anzahl von Threads werden gestartet, bevor der Code als Teil der JVM ausgeführt wird. Hier ist, was jstack sagt auf meinem Jvm läuft, wenn ich Ihren Code ausführen (mit Schlaf in dort, damit ich messen kann):

"Attach Listener" daemon prio=10 tid=0x000000004038c400 nid=0x3adf runnable [0x0000000000000000..0x0000000000000000] 
    java.lang.Thread.State: RUNNABLE 

"Low Memory Detector" daemon prio=10 tid=0x00007f7dc4002400 nid=0x3ac5 runnable [0x0000000000000000..0x0000000000000000] 
    java.lang.Thread.State: RUNNABLE 

"CompilerThread1" daemon prio=10 tid=0x0000000040386400 nid=0x3ac4 waiting on condition [0x0000000000000000..0x0000000000000000] 
    java.lang.Thread.State: RUNNABLE 

"CompilerThread0" daemon prio=10 tid=0x0000000040384000 nid=0x3ac3 waiting on condition [0x0000000000000000..0x0000000000000000] 
    java.lang.Thread.State: RUNNABLE 

"Signal Dispatcher" daemon prio=10 tid=0x0000000040382000 nid=0x3ac2 runnable [0x0000000000000000..0x0000000040c43710] 
    java.lang.Thread.State: RUNNABLE 

"Finalizer" daemon prio=10 tid=0x0000000040363000 nid=0x3ac1 in Object.wait() [0x0000000042186000..0x0000000042186a00] 
    java.lang.Thread.State: WAITING (on object monitor) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x00007f7dfaaa1210> (a java.lang.ref.ReferenceQueue$Lock) 
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) 
    - locked <0x00007f7dfaaa1210> (a java.lang.ref.ReferenceQueue$Lock) 
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) 
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) 

"Reference Handler" daemon prio=10 tid=0x000000004035bc00 nid=0x3ac0 in Object.wait() [0x0000000042085000..0x0000000042085d80] 
    java.lang.Thread.State: WAITING (on object monitor) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x00007f7dfaaa1078> (a java.lang.ref.Reference$Lock) 
    at java.lang.Object.wait(Object.java:485) 
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) 
    - locked <0x00007f7dfaaa1078> (a java.lang.ref.Reference$Lock) 

"main" prio=10 tid=0x00000000402f5800 nid=0x3abc waiting on condition [0x0000000041015000..0x0000000041015ec0] 
    java.lang.Thread.State: TIMED_WAITING (sleeping) 
    at java.lang.Thread.sleep(Native Method) 
    at Simulation.main(Simulation.java:16) 

"VM Thread" prio=10 tid=0x0000000040356400 nid=0x3abf runnable 

"GC task thread#0 (ParallelGC)" prio=10 tid=0x0000000040300400 nid=0x3abd runnable 

"GC task thread#1 (ParallelGC)" prio=10 tid=0x0000000040301c00 nid=0x3abe runnable 

"VM Periodic Task Thread" prio=10 tid=0x00007f7dc4004c00 nid=0x3ac6 waiting on condition 
2

Ja. Die Thread-ID wird jedoch von der gesamten JVM gemeinsam genutzt, sodass sie für Ihre Anwendung mit einer beliebigen Nummer beginnen kann.

0

Die Thread-ID ist eine positive lange Zahl, die generiert wurde, als dieser Thread erstellt wurde. Die Thread-ID ist eindeutig und bleibt während ihrer Lebensdauer unverändert. Wenn ein Thread beendet wird, kann diese Thread-ID wiederverwendet werden.

Referenz: http://java.sun.com/javase/6/docs/api/java/lang/Thread.html

Es braucht nicht von 0 oder jeder anderen Zahl zu starten.

Verwandte Themen