2011-04-10 16 views

Respuesta

13

No creo que pueda agregar atributos a un hilo dado en Java, pero podría usar una instancia ThreadLocal para almacenar cualquier información especial por hilo.

http://download.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html

+1

Esto es exactamente como se hace en log4j MDC, y también el contexto de transacción de EJB y el contexto de seguridad se realiza de la misma manera durante una solicitud: esta es una de las razones por las que EJB prohíbe iniciar subprocesos propios. –

4

Aquí es código de ejemplo para la respuesta de @ edalorzo:

import java.util.HashMap; 
import java.util.Map; 

public class ThreadAttributes { 
    private static ThreadLocal<Map<String, String>> threadAttrs = new ThreadLocal<Map<String, String>>() { 
     @Override 
     protected Map<String, String> initialValue() { 
      return new HashMap<String, String>(); 
     } 
    }; 

    public static String get(String key) { 
     return threadAttrs.get().get(key); 
    } 

    public static void set(String key, String value) { 
     threadAttrs.get().put(key, value); 
    } 
} 

Para usarlo simplemente esto:

ThreadAttributes.get("attribute"); //to get an attribute 
ThreadAttributes.set("attribute", "toValue"); //to set an attribute 

Advertencia: si la aplicación crea hilos de lotes y no reutiliza ellas este código potencialmente perderá HashMap s.

+0

Por otro lado, las variables ThreadLocal tienden a tener problemas con los grupos de subprocesos, ya que cuando se reutiliza una banda de rodadura del grupo, se le asignará la misma variable local de subprocesos que la última vez que se usó. Por lo tanto, es importante verificar que esto no sea un problema. –

+1

Eso es muy cierto. Supongo que realmente depende de cuál es el requisito. Si necesita atributos que tengan un alcance de tarea ('Runnable # run()' -scoped, por ejemplo), puede valer la pena consultar el código fuente de Google Guice framework, que le permite ubicar instancias. – rodion

Cuestiones relacionadas