2009-03-31 15 views
5

En Java 1.4, ¿hay alguna forma mejor de obtener un ID de subproceso que utilizando Thread.getName()?Obtenga el identificador único de un subproceso en Java 1.4

Quiero decir, getName() en pruebas unitarias devuelve algo así como "Thread-1", pero en WebLogic 10 obtengo "[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'.xml".

+0

Ok, necesitamos más información aquí. ¿Le interesan todos los hilos o solo los que crea (suena como todos)? ¿Necesita devolver el mismo valor con cada ejecución de las pruebas unitarias o puede el valor devuelto ser diferente cada vez que se ejecutan las pruebas unitarias? – TofuBeer

Respuesta

8

Thread.getId (puede teóricamente overflow, pero está definido como no y en la práctica no).

1.5 está pasando por su período de fin de vida útil ahora, pero si está utilizando cubiertas polvorientas antiguas 1.4, puede implementar las suyas con ThreadLocal. (¡Tenga en cuenta que no sigue los documentos de la API de Java SE 6 demasiado de cerca!)

+0

Sin embargo, esa es solo la implementación de Sun, podría cambiarse no simplemente a ++ y, en realidad, ser agresivo en la reutilización. Es probable que las probabilidades de que eso ocurra sean bajas, y las probabilidades de una implementación diferente, digamos que el proyecto Classpath, usando un método diferente son escasas. – TofuBeer

+0

Classpath (¿aún no está muerto?) Y Harmony podría usar implementaciones diferentes, obviamente no conformes, pero en la práctica eso es solo una posibilidad teórica. –

+0

@Tom Hawtin: Pero los documentos de la API especifican: "Cuando se finaliza un hilo, este ID de hilo puede reutilizarse". –

2

Puede usar getID si utiliza JDK 1.5 o superior.

¿Es el caso que necesita un valor constante para cada vez que ejecuta las pruebas unitarias, o es solo un valor único lo suficientemente bueno?

3

¿Por qué lo necesita? Porque dependiendo de tu respuesta, hay varios enfoques.

Primero, entienda que el nombre de un hilo no garantiza ser único. Tampoco es el código hash de identidad.

Si realmente desea asociar una ID única a un hilo, tendrá que hacerlo usted mismo. Probablemente usando IdentityHashMap. Sin embargo, eso introducirá una referencia fuerte que no querrá tener en una aplicación de producción.

Editar: TofuBeer tiene una solución que es probablemente mejor, aunque los documentos tienen en cuenta que los identificadores de subprocesos se pueden reutilizar.

3

Como se mencionó en "Thread.getId() global uniqueness question" cuestión de forma, y ​​confirmado por el código fuente de Thread.java:

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

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

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

id El hilo es muy fácil de implementar sí mismo si su todavía están en java1.4.
Sin embargo, esta implementación significa que un hilo determinado no tendrá la misma identificación cuando ejecute el programa varias veces.
Así que dependiendo de lo que necesita, puede que tenga que poner en práctica una política de nombres, que es a la vez:

  • único para una sesión de ejecución dado
  • reutilizados de una sesión a
  • todavía vinculados a la original interna política de nombres gestionada por el 1.4 JVM ("Thread-1", "Thread-2", ...)
Cuestiones relacionadas