InheritableThreadLocal用法与ThreadLocal的区别
2016-07-02 21:50
681 查看
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
Thread01 InheritableThreadLocal: test01
main******************************************
main ThreadLocal: test01
main InheritableThreadLocal: test01
InheritableThreadLocal
该类扩展了 ThreadLocal,为子线程提供从父线程那里继承的值:在创建子线程时,子线程会接收所有可继承的线程局部变量的初始值,以获得父线程所具有的值。通常,子线程的值与父线程的值是一致的;但是,通过重写这个类中的 childValue 方法,子线程的值可以作为父线程值的一个任意函数。
当必须将变量(如用户 ID 和 事务 ID)中维护的每线程属性(per-thread-attribute)自动传送给创建的所有子线程时,应尽可能地采用可继承的线程局部变量,而不是采用普通的线程局部变量。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树