InheritableThreadLocal用法与ThreadLocal的区别

 二维码 452
发表时间:2016-07-02 21:31
  1. public class TestThreadLocal {  

  2.   static final String VALUE01 = "test01";  

  3.   static final String VALUE02 = "test02";  

  4.   public static void main(String[] args) throws InterruptedException {  

  5.       ThreadLocal<String> threadLocal = new ThreadLocal<String>();  

  6.       threadLocal.set(VALUE01);  

  7.       InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<String>();  

  8.       inheritableThreadLocal.set(VALUE01);  

  9.       Thread thread_1 = new Thread_TestThreadLocal(threadLocal, inheritableThreadLocal);  

  10.       thread_1.setName("Thread01");  

  11.       thread_1.start();  

  12.       thread_1.join();  

  13.       System.out.println(Thread.currentThread().getName() + "******************************************");  

  14.       System.out.println(Thread.currentThread().getName() + "\tThreadLocal: " + threadLocal.get());  

  15.       System.out.println(  

  16.               Thread.currentThread().getName() + "\tInheritableThreadLocal: " + inheritableThreadLocal.get());  

  17.   }  

  18. }  

  19. class Thread_TestThreadLocal extends Thread {  

  20.   ThreadLocal<String> threadLocal;  

  21.   InheritableThreadLocal<String> inheritableThreadLocal;  

  22.   public Thread_TestThreadLocal(ThreadLocal<String> threadLocal,  

  23.           InheritableThreadLocal<String> inheritableThreadLocal) {  

  24.       super();  

  25.       this.threadLocal = threadLocal;  

  26.       this.inheritableThreadLocal = inheritableThreadLocal;  

  27.   }  

  28.   public void run() {  

  29.       // 下面的输出就是说是了InheritableThreadLocal的用法,这里threadLocal输出的是null,因是这是一个新的线程。  

  30.       //而InheritableThreadlocal不是空,它把原来线程的初始化值携带过来了。  

  31.       System.out.println(Thread.currentThread().getName() + "\tThreadLocal: " + threadLocal.get());  

  32.       System.out.println(  

  33.               Thread.currentThread().getName() + "\tInheritableThreadLocal: " + inheritableThreadLocal.get());  

  34.           }  

  35. }  

打印结果:

Thread01    ThreadLocal: null

Thread01    InheritableThreadLocal: test01
main******************************************
main    ThreadLocal: test01

main    InheritableThreadLocal: test01

InheritableThreadLocal

该类扩展了 ThreadLocal,为子线程提供从父线程那里继承的值:在创建子线程时,子线程会接收所有可继承的线程局部变量的初始值,以获得父线程所具有的值。通常,子线程的值与父线程的值是一致的;但是,通过重写这个类中的 childValue 方法,子线程的值可以作为父线程值的一个任意函数。

当必须将变量(如用户 ID 和 事务 ID)中维护的每线程属性(per-thread-attribute)自动传送给创建的所有子线程时,应尽可能地采用可继承的线程局部变量,而不是采用普通的线程局部变量。

打印结果:

Thread01    ThreadLocal: null

Thread01    InheritableThreadLocal: test01
main******************************************
main    ThreadLocal: test01

main    InheritableThreadLocal: test01

InheritableThreadLocal

该类扩展了 ThreadLocal,为子线程提供从父线程那里继承的值:在创建子线程时,子线程会接收所有可继承的线程局部变量的初始值,以获得父线程所具有的值。通常,子线程的值与父线程的值是一致的;但是,通过重写这个类中的 childValue 方法,子线程的值可以作为父线程值的一个任意函数。

当必须将变量(如用户 ID 和 事务 ID)中维护的每线程属性(per-thread-attribute)自动传送给创建的所有子线程时,应尽可能地采用可继承的线程局部变量,而不是采用普通的线程局部变量。