ThreadLocal不是重载线程构造函数

时间:2016-07-26 04:37:59

标签: java thread-local

我有以下课程

此类用于保留我的所有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

1 个答案:

答案 0 :(得分:1)

你几乎在这里回答了你的问题 -

  

只要它们来自同一个线程

Test方法的构造函数在不同的线程中运行,而不是在Test::run方法内运行的代码。