Domanda

In Java 1.4, c'è un modo migliore di ottenere l'ID di un thread di utilizzare Thread.getName()?

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

È stato utile?

Soluzione

Thread.getId (può teoricamente troppo pieno , ma è definito non e in pratica sarà non).

1.5 sta attraversando la sua Fine del periodo di servizio vita ora, ma se si sta utilizzando vecchi polverosi-mazzi 1.4, quindi è possibile implementare il proprio con ThreadLocal . (Nota, non seguire troppo da vicino le Java SE 6 documentazione API!)

Altri suggerimenti

Perché avete bisogno di questo? Perché a seconda della risposta, ci sono diversi approcci.

In primo luogo, capire che il nome di un thread non è garantito per essere unico. E non è l'identità codice hash.

Se veramente si vuole associare un ID univoco a un filo, si sta andando ad avere bisogno di farlo da soli. Probabilmente utilizzando un IdentityHashMap. Tuttavia, che introdurrà un riferimento forte che non si desidera avere in giro in un'applicazione di produzione.

Modifica:. TofuBeer ha soluzione che probabilmente è meglio, anche se la documentazione di notare che gli ID di thread possono essere riutilizzati

Come indicato nella " Thread.getId () domanda unicità globale " domanda SO , 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;
}

solo l'ID è molto semplice da implementare da soli se siete ancora in Java1.4.
Tuttavia questa implementazione significa un dato thread non avrà lo stesso ID quando si esegue il programma più volte.
Quindi, a seconda di ciò che è necessario, potrebbe essere necessario attuare una politica di denominazione, che è al tempo stesso:

  • unico per una determinata sessione di runtime
  • riutilizzati da sessione a sessione
  • ancora legata alla politica di denominazione originale interna gestita dalla JVM 1.4 ( "Thread-1", "Thread-2", ...)

È possibile utilizzare getID se siete su JDK 1.5 o superiore.

E 'vero che avete bisogno di un valore coerente per ogni volta che si esegue il test di unità, o è solo un valore unico abbastanza buono?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top