2011-01-13 17 views
13

Tengo un programa Java multiproceso con un conjunto de reglas sobre el subprocesamiento: por ejemplo, el código de la clase A solo debe invocarse desde el subproceso UI; 3 métodos en la clase B deben llamarse solo desde el hilo de la red, etc.¿Cómo verifica qué hilo está ejecutando el código en Java?

¿Alguna sugerencia sobre cómo hacer afirmaciones u otras verificaciones de código para que se sigan estas reglas? Me gustaría hacer el equivalente a la prueba de "invariantes" para evitar errores de codificación en el uso de subprocesos. .

Respuesta

12

Además de una excelente sugerencia de adamfisk, también hay un método de conveniencia para específicamente probando si el hilo actual es el hilo EDT:

EventQueue.isDispatchThread() 
+1

+1: al escribir Swing, la pregunta de UI/no UI suele ser la única que es importante. – kdgregory

+1

gracias, no estoy usando swing pero supongo que muchas personas que lean esto serán. – Nils

16

Thread.currentThread() getName()

+0

+1 Cuidado para redondear su respuesta con la respuesta de RD01 para el caso columpio? – Nils

1

lo haría como esto en mi código en la clase A:

if(!"UI thread".equals(Thread.currentThread().getName())){ 
    throw new IllegalStateException("wrong thread running this class, thread name:"+Thread.currentThread().getName()); 
} 
2

Considere la posibilidad de invertir la pregunta. Considere la prevención en lugar de la aplicación.

Si la clase Mangalor solo se puede ejecutar en un subproceso de interfaz de usuario, limite la visibilidad de la clase Mangalor a las clases de la interfaz de usuario. Si los métodos talk() y listen() de la clase CanOnString solo deben ejecutarse en un hilo de red, limite la visibilidad de esos métodos a las clases que ejecuta en su hilo de red.

7

Usted puede intentar

assert Thread.currentThread() == expectedThread; 

El problema con el uso del nombre es que cualquier número de hilos puede utilizar ese nombre, por ejemplo, si eres particularmente paranoico, podrías preocuparte por un código como este.

Thread.t = Thread.currentThread(); 
String name = t.getName(); 
t.setName("UI thread"); 
callUIThreadOnlyMethod(); 
t.setName(name); 
+0

¿Hay escenarios además de un codificador malicioso donde podría ocurrir este tipo de aliasing? – Nils

+0

Estándares de nomenclatura de subprocesos defectuosos y errores de copiar y pegar. La mayoría de los programas no están escritos para garantizar que los nombres de los temas sean únicos y ve nombres duplicados a menudo. –

0

También puede consultar el nombre de la secuencia mediante el registro, p. log4j o logback, acaba de establecer un patrón que incluye %thread así:

<configuration> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
    </appender> 
    <root level="INFO"> 
    <appender-ref ref="STDOUT" /> 
    </root> 
</configuration> 
Cuestiones relacionadas