2009-08-11 1 views
4

Я работаю над назначением взаимного исключения, но когда я начал, я заметил начало идентификатора потока приложений в 9. Он не изменяется, когда я компилирую и выполняю его снова. Есть ли какая-то проблема, которую я пропущу, или могут ли идентификаторы Java Thread начинаться с произвольного числа? This question связан.Должны ли идентификаторы Java Thread всегда начинаться с 0?


Для тех, кто заинтересован, вот это класс от Herlihy & Shavit "Искусство многопроцессорных программирования" для нумерации нитей:

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); 
    } 
} 

Вы можете позвонить

ThreadID.get(); 

, который будет автоматически увеличивать числа и всегда начинать с 1.

ответ

7

F rom Thread#getId() документация:

Возвращает идентификатор этой темы. Идентификатор потока является положительным длинным номер, сгенерированный, когда эта нить была создана. Идентификатор потока уникален, и остается неизменным в течение всего срока его службы. Если поток завершен, этот идентификатор потока может быть использован повторно.

Ничто не указывает на то, что он гарантированно будет начинаться 0. Я бы предположил, что внутри, Java делает несколько объектов темы до первого, который вы создаете, и поэтому идентификаторы нитей 0 – 8 уже заняты. Однако ничто в документации не гарантирует, что это число будет каким-либо образом последовательным (хотя так оно и выполняется в настоящее время), поэтому вы не должны зависеть от этого.

0

Я не знаю, есть ли спецификация, которая определяет это, или насколько надежной или последовательной будет эта нумерация, но потоки, которые вы создаете в своем коде, не являются первыми работающими потоками в системе, потоки запускаются до того, как ваш код запускается как часть JVM. Вот что говорит jstack работает на моем JVM, когда я запускаю свой код (с сна в там, так что я могу измерить):

"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

Да. Но идентификатор потока разделяется целым JVM, поэтому для вашего приложения он может начинаться с любого числа.

0

Идентификатор потока - это положительное длинное число, сгенерированное при создании этой темы. Идентификатор потока уникален и остается неизменным в течение всего срока его службы. Когда поток завершается, этот идентификатор потока может быть повторно использован.

ссылка: http://java.sun.com/javase/6/docs/api/java/lang/Thread.html

Это не нужно начинать с 0 или любым другим числом.

 Смежные вопросы

  • Нет связанных вопросов^_^