Question

En Java 1.4, est-il une meilleure façon d'obtenir l'ID d'un fil que l'utilisation Thread.getName()?

Je veux dire, getName() dans les tests unitaires retourne quelque chose comme "Thread-1", mais dans WebLogic 10 je reçois "[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'.xml".

Était-ce utile?

La solution

Thread.getId (il peut théoriquement de trop-plein, mais il est défini pas et dans la pratique sera non).

1,5 traverse sa fin de la période de vie de service, mais si vous utilisez de vieux ponts poussiéreux-1.4, vous pouvez mettre en œuvre votre propre avec ThreadLocal . (Remarque, ne suivez pas les Java SE 6 API docs trop près!)

Autres conseils

Pourquoi avez-vous besoin? Parce que selon votre réponse, il existe plusieurs approches.

D'abord, comprendre que le nom d'un thread n'est pas garanti d'être unique. Ni est l'identité hashcode.

Si vous voulez vraiment associer un identifiant unique à un fil, vous allez avoir besoin de faire vous-même. Probablement en utilisant un IdentityHashMap. Toutefois, cela introduira une référence forte que vous ne voulez pas avoir à traîner dans une application de production.

Modifier. TofuBeer a une solution qui est probablement mieux, bien que les docs noter que les ID de fil peuvent être réutilisés

Comme mentionné dans " Thread.getId () question unicité globale " question SO , et confirmée par le code source de Thread.java :

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

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

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

L'identifiant de fil est très simple à implémenter vous-même si vous êtes encore en java1.4.
Cependant, cette mise en œuvre signifie un fil donné ne sera pas le même identifiant lorsque vous exécutez votre programme à plusieurs reprises.
Donc, en fonction de ce que vous avez besoin, vous devrez peut-être mettre en œuvre une politique de nommage qui est à la fois:

  • unique pour une session d'exécution donné
  • réutilisé d'une session à
  • encore liée à la politique de nommage d'origine interne géré par la machine virtuelle Java 1.4 ( "thread-1", "thread-2", ...)

Vous pouvez utiliser getID si vous êtes sur JDK 1.5 ou supérieur.

Est-ce le cas que vous avez besoin d'une valeur cohérente pour chaque fois que vous exécutez les tests unitaires, ou est juste une valeur unique assez bon?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top