在下面的代码中我将临时threadlocal值存储在threadlocal类中。并将值设置为另一个类..
List<String> spaces=new ArrayList<String>();
spaces.add(spaceKey);
ThreadLocal<List<String>> threadLocal=new ThreadLocal<List<String>>();
threadLocal.set(spaces);
setShardHolder(threadLocal);
我在另一个班级有吸气鬼和二传手
private ThreadLocal<List<String>> shardHolder;
public ThreadLocal<List<String>> getShardHolder() {
return shardHolder;
}
public void setShardHolder(ThreadLocal<List<String>> shardHolder) {
this.shardHolder = shardHolder;
}
我无法使用getter访问值
答案 0 :(得分:11)
您似乎并未理解ThreadLocal变量的工作原理。 ThreadLocal实例有点像单个值的容器。如果您在其中存储了某些内容,它将与当前线程相关联,您可以稍后从同一个线程中检索它。
但是,当然,如果你在ThreadLocal实例中存储某些东西,并尝试从另一个ThreadLocal实例中检索它,你将总是得到null:它们不是同一个容器。
因此,ThreadLocal通常隐藏在静态方法之后。例如,假设您要将用户与当前线程相关联。你会做的
public class CurrentUser {
private static final ThreadLocal<User> CURRENT = new ThreadLocal<User>();
public static User getCurrentUser() {
return CURRENT.get();
}
public static void setCurrentUser(User user) {
CURRENT.set(user);
}
}
然后让我们设计一个场景:
public class Test
public static void main(String[] args) {
CurrentUser.set(new User("foo"));
System.out.println(CurrentUser.get()); // prints foo
new Thread(new Runnable() {
public void run() {
System.out.println(CurrentUser.get()); // prints null: different thread
}
}).start();
}
}
答案 1 :(得分:3)
要获取任何对象的值,您需要对其进行引用。如果您可以在类中引用ThreadLocal,则可以访问它。 (在这方面,ThreadLocal没有什么特别之处)
我建议你试试。
我无法使用getter访问值
这意味着你做错了什么,但既然你没有说明为什么你不能这样做,那就不清楚那是什么了。
如果你说你可以获得一个ThreadLocal,但是调用它返回null
,这意味着你在另一个线程中运行它。这就是ThreadLocal的目的。
答案 2 :(得分:0)
你可以将你的线程本地设置为静态变量并以这种方式使用它,看看这篇文章我确定其中一个例子适合你的用例。
http://java.dzone.com/articles/java-thread-local-%E2%80%93-how-use
答案 3 :(得分:0)
在javadoc中,ThreadLocal
实例通常是希望将状态与线程关联的类中的私有静态字段。例如:
private static final ThreadLocal<List<String>> SHARD_HOLDER;
public static List<String> getSpacesList() {
return SHARD_HOLDER.get();
}
public static void setSpacesList(List<String> spacesList) {
SHARD_HOLDER.set(spacesList);
}