我有以下课程
此类用于保留我的所有ThreadLocal数据成员
public class ThreadLocalManager
{
public static final ThreadLocal<String> myThreadLocal = new ThreadLocal<String>();
}
以下类用于测试ThreadLocal
public class Test extends Common implements Runnable
{
public Test(String country, String machine)
{
Common.machine = machine;
Common.country = country;
ThreadLocalManager.myThreadLocal.set("HI");
}
@Override
public void run()
{
while (true)
{
try
{
Liker liker = new Liker();
liker.run();
}
}
}
}
此类用于测试是否正确设置了datamemeber
public class Liker
{
public void run()
{
System.out.println((String) ThreadLocalManager.myThreadLocal.get());
}
}
修改
这就是我创建线程的方式
Thread newThread = new Thread(new Test(country, machine));
newThread.start();
我感到困惑的一件事就是如上所述,当我在ThreadLocalManager.myThreadLocal.set("HI");
构造函数中调用Test
时,我从null
运行中得到Liker
方法。但是,如果我在ThreadLocalManager.myThreadLocal.set("HI");
运行方法中调用Test
,则Liker.run()
会打印HI
我认为只要它们来自同一个线程,就可以从所有类和对象访问该值。当我从构造函数中调用它时,为什么不存储值HI
?
答案 0 :(得分:1)
你几乎在这里回答了你的问题 -
只要它们来自同一个线程
Test
方法的构造函数在不同的线程中运行,而不是在Test::run
方法内运行的代码。