主线程如何能够访问另一个线程的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。但这给了它其他价值
答案 0 :(得分:0)
您的示例显示了ThreadLocal
与仅仅是Thread
实例的成员变量的混淆。概念是相似的。两者都允许您将状态与Thread
实例相关联,但是ThreadLocal
允许您在线程实例本身之外进行操作。正如您已经指出的,ThreadLocal
不辜负其名称-当您在其上调用get
和set
时,这些值是该线程的 specific ,这就是为什么尝试访问另一个线程的状态(如您的示例中的主线程试图这样做)无法正常工作的原因。
ThreadLocal
有时是有用的,但是在日常编程中,几乎不需要它们。一种用例是类似于服务器进程的服务器,该进程接受传入的请求并将某些状态与该请求相关联。如果您不想更改所有方法签名来传递该状态,则可以将其放在ThreadLocal
中。通常每个JVM有一个ThreadLocal
实例。