将属性添加到当前Java线程

jre*_*rey 7 java multithreading

如何在Java中设置' attributes'当前Thread,我想设置键值并在另一个地方获取值,但是在同一个线程中.喜欢这个http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.html

Edw*_*rzo 14

我不认为你可以在Java中为任何给定的线程添加属性,但是你可以使用一个ThreadLocal实例来存储每个线程的任何特殊信息.

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

  • 这正是它在log4j MDC中的完成方式,并且EJB事务上下文和安全上下文在请求期间也以相同的方式传递 - 这是EJB禁止启动自己的线程的原因之一. (2认同)

rod*_*ion 6

以下是@ 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用它:

ThreadAttributes.get("attribute"); //to get an attribute
ThreadAttributes.set("attribute", "toValue"); //to set an attribute
Run Code Online (Sandbox Code Playgroud)

警告:如果您的应用程序创建了大量线程并且没有重用它们,则此代码可能会泄漏HashMap.

  • 另一方面,ThreadLocal变量在线程池中往往会出现问题,因为当重新使用池中的一个脚步时,将为其分配与上次使用时相同的线程局部变量。因此,检查这不是问题很重要。 (2认同)