public class TestThreadLocal {
static final String VALUE01 = "test01";
static final String VALUE02 = "test02";
public static void main(String[] args) throws InterruptedException {
ThreadLocal<String> threadLocal = new ThreadLocal<String>();
threadLocal.set(VALUE01);
InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<String>();
inheritableThreadLocal.set(VALUE01);
Thread thread_1 = new Thread_TestThreadLocal(threadLocal, inheritableThreadLocal);
thread_1.setName("Thread01");
thread_1.start();
thread_1.join();
System.out.println(Thread.currentThread().getName() + "******************************************");
System.out.println(Thread.currentThread().getName() + "\tThreadLocal: " + threadLocal.get());
System.out.println(
Thread.currentThread().getName() + "\tInheritableThreadLocal: " + inheritableThreadLocal.get());
}
}
class Thread_TestThreadLocal extends Thread {
ThreadLocal<String> threadLocal;
InheritableThreadLocal<String> inheritableThreadLocal;
public Thread_TestThreadLocal(ThreadLocal<String> threadLocal,
InheritableThreadLocal<String> inheritableThreadLocal) {
super();
this.threadLocal = threadLocal;
this.inheritableThreadLocal = inheritableThreadLocal;
}
public void run() {
// 下面的输出就是说是了InheritableThreadLocal的用法,这里threadLocal输出的是null,因是这是一个新的线程。
//而InheritableThreadlocal不是空,它把原来线程的初始化值携带过来了。
System.out.println(Thread.currentThread().getName() + "\tThreadLocal: " + threadLocal.get());
System.out.println(
Thread.currentThread().getName() + "\tInheritableThreadLocal: " + inheritableThreadLocal.get());
}
}
打印结果:
Thread01 ThreadLocal: null
main******************************************
main ThreadLocal: test01
main InheritableThreadLocal: test01
InheritableThreadLocal
该类扩展了 ThreadLocal,为子线程提供从父线程那里继承的值:在创建子线程时,子线程会接收所有可继承的线程局部变量的初始值,以获得父线程所具有的值。通常,子线程的值与父线程的值是一致的;但是,通过重写这个类中的 childValue 方法,子线程的值可以作为父线程值的一个任意函数。
当必须将变量(如用户 ID 和 事务 ID)中维护的每线程属性(per-thread-attribute)自动传送给创建的所有子线程时,应尽可能地采用可继承的线程局部变量,而不是采用普通的线程局部变量。