如何在Java中为当前Thread
设置'attributes
',我想设置键值并在同一线程的另一个位置获取该值。类似于http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.html
如何在Java中为当前Thread
设置'attributes
',我想设置键值并在同一线程的另一个位置获取该值。类似于http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.html
我认为在Java中无法为任何给定的线程添加属性,但是您可以使用ThreadLocal
实例来为每个线程存储任何特殊信息。
http://download.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html
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);
}
}
只需这样使用:
ThreadAttributes.get("attribute"); //to get an attribute
ThreadAttributes.set("attribute", "toValue"); //to set an attribute
警告:如果您的应用程序创建了大量线程并且不重用它们,则此代码可能会泄漏 HashMap
。
Runnable#run()
的范围),那么看一下Google Guice框架的源代码可能是值得的,它允许你对实例进行作用域限定。 - rodion