当我们想把线程和某些变量联系起来的时候,有人就会说,那不简单,我在run()里面定义一个不就行了吗,对这确实可以,但如果我们写的很多个run()里面都有一个作用相同,名字相同的变量,那么我们每次都得重新写一次,不觉得这样很麻烦吗?所有多线程局部变量就这样出现了。
ThreadLoacl
import javax.naming.ldap.PagedResultsControl;
class h{
private static volatile ThreadLocal<String> threadLocal = new ThreadLocal<String>();
public static void main(String[] args)
{
Runnable r1 = ()->{
String name = Thread.currentThread().getName();
if(name.equals("A"))
{
threadLocal.set("123");
}
else
{
threadLocal.set("456");
}
System.out.println(threadLocal.get());
};
Thread thread1 = new Thread(r1);
Thread thread2 = new Thread(r1);
thread1.setName("A");
thread2.setName("B");
thread1.start();
thread2.start();
}
}
在这个例子我们可以看到,首先我们定义了一个全局的ThreadLocal,然后直接就能在线程里面使用了,使用的方法也很简单,具体方法有以下几个:
1.set()
设置变量值。
2.remove()
清除这个变量的值。
3.get()
获取该变量的值。
InheritableThreadLocal
import javax.naming.ldap.PagedResultsControl;
class h{
private static volatile InheritableThreadLocal<String> threadLocal = new InheritableThreadLocal<String>();
public static void main(String[] args)
{
Runnable r1 = ()->{
threadLocal.set("123");
Runnable r2 = ()->{
System.out.println(threadLocal.get());
};
Thread thread = new Thread(r2);
thread.start();
};
Thread thread1 = new Thread(r1);
thread1.start();
}
}
这个和前者有什么不一样呢?首先如果我们在一个run()里面开了一个线程,那么说明这个新开线程是该线程的子线程,但我们想继续用父线程的变量,但ThreadLocal是一个线程独有的,每一个线程只能有一个,而且互相之间是不可见的,那怎么办呢?
InheritableThreadLocal就实现了这个功能,它默认子进程的局部变量的初始化值为父进程的值,它的用法和ThreadLocal没什么不同,只是功能多了这一点而已