主线程可以访问线程的Threadlocal

时间:2019-05-05 03:46:14

标签: java multithreading thread-local

主线程如何能够访问另一个线程的threadlocal?尽管另一个线程的threadlocal在主线程中提供的值与其在其自己的run方法内部提供的值不同。

class MyThread13 extends Thread{
    static int id =0;
     ThreadLocal threadLocal = new ThreadLocal(){
       public Integer initialValue(){
            return ++id;
        }
    };
    public MyThread13(String name){
        super(name);
    }
    public void run(){
        System.out.println(Thread.currentThread().getName()+" is executing with id :"+threadLocal.get());

    }

}

public class MultiThreading13ThreadLocalB {
    public static void main(String[] args) {
        MyThread13 myThread13a = new MyThread13("Thread:1");
        MyThread13 myThread13b = new MyThread13("Thread:2");
        myThread13a.start();
        myThread13b.start();
        myThread13c.start();
       // myThread13d.start();
        System.out.println("Accessing threadlocal from main :"+myThread13a.threadLocal.get());

    }
}

当从主线程访问另一个线程的threadlocal时,它应该为null。但这给了它其他价值

1 个答案:

答案 0 :(得分:0)

您的示例显示了ThreadLocal与仅仅是Thread实例的成员变量的混淆。概念是相似的。两者都允许您将状态与Thread实例相关联,但是ThreadLocal允许您在线程实例本身之外进行操作。正如您已经指出的,ThreadLocal不辜负其名称-当您在其上调用getset时,这些值是该线程的 specific ,这就是为什么尝试访问另一个线程的状态(如您的示例中的主线程试图这样做)无法正常工作的原因。

ThreadLocal有时是有用的,但是在日常编程中,几乎不需要它们。一种用例是类似于服务器进程的服务器,该进程接受传入的请求并将某些状态与该请求相关联。如果您不想更改所有方法签名来传递该状态,则可以将其放在ThreadLocal中。通常每个JVM有一个ThreadLocal实例。