2009-02-26 12 views
10

Se più applicazioni Java sono in esecuzione su un sistema, ciascun ID di thread è univoco rispetto a tutti gli altri thread Java, indipendentemente dall'applicazione in cui vengono eseguiti?Thread.getId() domanda di univocità globale

Si suppone che le applicazioni Java siano in scatola di sabbia rispetto ad altre applicazioni Java, quindi ho pensato che fosse possibile che gli ID di thread si scontrassero.

Se gli ID di thread sono univoci in tutte le applicazioni, non verranno a mancare alcune (anche se molto minori) informazioni su altre applicazioni nel sistema? Come quanti thread sono stati avviati in altre applicazioni o anche se altre applicazioni Java sono in esecuzione?

+1

dovrei probabilmente F3 in metodi in Eclipse prima di postare ... –

risposta

21

Bene, fammi controllare la fonte.

Nel metodo s' il Threadinit (che è chiamato da ogni costruttore):

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

In nextThreadID():

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

E:

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

Non è mai impostato e, quindi, il valore predefinito è 0.

Quindi, apparentemente, i numeri ID dei thread iniziano sempre da 0 e incrementano di 1. In altre parole, la risposta alla domanda è che sono non globalmente univoci.

7

Secondo l'origine JDK, un ID di thread è univoco in una data JVM - infatti, è semplicemente implementato come una sequenza in esecuzione.

Ecco il metodo nextThreadID() da 1.6.0_10:

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

(probabilmente c'è in realtà una lunga bug di overflow in là, probabilmente non è mai realmente accaduto)

+0

Sì, penso che sia improbabile che qualsiasi sistema esistente possa eseguire thread 9223372036854775807. :) –

+0

Non ha bisogno di eseguirli simultaneamente ... supponiamo che ci sia un sistema che crea un nuovo thread ogni secondo (ovviamente dovrebbe essere un pool di thread, ma supponiamo che non lo sia). Questo è solo 292471208677 anni di funzionamento continuo : P – Jared

+0

Generare una nuova discussione ogni millisecondo comporterebbe un trabocco di 292 277.266 millenni. –