2009-03-31 19 views
5

In Java 1.4, c'è un modo migliore per ottenere l'ID di una discussione rispetto all'utilizzo di Thread.getName()?Ottieni identificatore univoco di una discussione in Java 1.4

Voglio dire, getName() in test di unità restituisce qualcosa come "Thread-1", ma in WebLogic 10 ottengo "[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'.xml".

+0

Ok, abbiamo bisogno di ulteriori informazioni qui. Ti interessano tutti i thread o solo quelli che crei (suona come tutti)? È necessario restituire lo stesso valore ad ogni esecuzione dei test unitari o il valore restituito può essere diverso ogni volta che vengono eseguiti i test unitari? – TofuBeer

risposta

8

Thread.getId (può teoricamente overflow, ma è definito non e in pratica non lo farà).

1.5 sta per passare il periodo di fine vita di servizio ora, ma se si utilizzano vecchi Dusty-Deck 1.4, è possibile implementare il proprio con ThreadLocal. (Nota, non seguire i documenti dell'API Java SE 6 troppo da vicino!)

+0

Questa è solo l'implementazione di Sun, ma potrebbe essere modificata non semplicemente in ++ e in realtà essere aggressivi al riutilizzo. Le probabilità che ciò accada sono probabilmente basse, e le probabilità di una diversa implementazione, ad esempio il progetto Classpath, utilizzando un metodo diverso è sottile. – TofuBeer

+0

Classpath (non è ancora morto) e Harmony potrebbe utilizzare implementazioni diverse, egregiamente non conformi, ma in pratica è solo una possibilità teorica. –

+0

@Tom Hawtin: Ma i documenti API specificano espressamente, "Quando un thread è terminato, questo ID thread può essere riutilizzato." –

2

È possibile utilizzare getID se si utilizza JDK 1.5 o versioni successive.

È necessario avere un valore costante per ogni volta che si eseguono i test di unità o è sufficiente un valore univoco?

3

Perché ne hai bisogno? Perché a seconda della risposta, ci sono diversi approcci.

Innanzitutto, è necessario capire che il nome di un thread non è garantito come univoco. Né è identità hashcode.

Se si desidera veramente associare un ID univoco a un thread, sarà necessario farlo da soli. Probabilmente usando una IdentityHashMap. Tuttavia, questo introdurrà un forte riferimento che non vorresti avere in giro in un'app di produzione.

Modifica: TofuBeer ha una soluzione che è probabilmente migliore, sebbene i documenti notino che gli ID di thread possono essere riutilizzati.

3

Come accennato in "Thread.getId() global uniqueness question" SO domanda, e confermato dal codice sorgente di Thread.java:

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

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

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

Il filo id è molto semplice da implementare da soli se siete ancora in Java1.4.
Tuttavia, questa implementazione indica che un determinato thread non avrà lo stesso id quando si esegue il programma più volte.
Quindi, a seconda di cosa avete bisogno, potrebbe essere necessario attuare una politica di denominazione, che è al tempo stesso:

  • unico per una determinata sessione di runtime
  • riutilizzati da una sessione all'altra
  • ancora legato a quello originale interna politica di denominazione gestita dalla JVM 1.4 ("Thread-1", "Thread-2", ...)
Problemi correlati