java多线程编程之InheritableThreadLocal
inheritablethreadlocal的作用: 当我们需要在子线程中使用父线程中的值得时候我们就可以像使用threadlocal那样来使用inheritablethreadlocal了。
首先我们来看一下inheritablethreadlocal的jdk源码:
package java.lang; import java.lang.ref.*; public class inheritablethreadlocal<t> extends threadlocal<t> { protected t childvalue(t parentvalue) { return parentvalue; } threadlocalmap getmap(thread t) { return t.inheritablethreadlocals; } void createmap(thread t, t firstvalue) { t.inheritablethreadlocals = new threadlocalmap(this, firstvalue); } }
这段代码就是inheritablethreadlocal的完整源码(删除了很长的注释)。
首先我们可以看到它是继承threadlocal类的,然后提供了:
protected t childvalue(t parentvalue){}方法,这就是inheritablethreadlocal的关键所在,它提供了这个方法,返回父线程中的值,如果还需要在父线程上添加值则可以重写childvalue方法。
package inheritablethreadlocal; import java.util.date; public class inheritablethreadlocaext extends inheritablethreadlocal{ protected object initialvalue() { return new date().gettime(); } protected object childvalue(object parentvalue) { return parentvalue+"对继承值进行修改"; } } package inheritablethreadlocal; public class tool { public static inheritablethreadlocaext t=new inheritablethreadlocaext(); } package inheritablethreadlocal; public class mythread extends thread{ public void run() { try { for(int i=0;i<10;i++) { system.out.println("在线程a中:"+tool.t.get()); sleep(100); } } catch (interruptedexception e) { e.printstacktrace(); } } } package inheritablethreadlocal; public class test { public static void main(string[] args) { try { for(int i=0;i<10;i++) { system.out.println("主线程中值:"+tool.t.get()); thread.sleep(100); } thread.sleep(5000); mythread thread=new mythread(); thread.start(); }catch(interruptedexception e){ e.printstacktrace(); } } }
运行输出:
主线程中值:1508210392057
主线程中值:1508210392057
主线程中值:1508210392057
主线程中值:1508210392057
主线程中值:1508210392057
主线程中值:1508210392057
主线程中值:1508210392057
主线程中值:1508210392057
主线程中值:1508210392057
主线程中值:1508210392057
在线程a中:1508210392057对继承值进行修改
在线程a中:1508210392057对继承值进行修改
在线程a中:1508210392057对继承值进行修改
在线程a中:1508210392057对继承值进行修改
在线程a中:1508210392057对继承值进行修改
在线程a中:1508210392057对继承值进行修改
在线程a中:1508210392057对继承值进行修改
在线程a中:1508210392057对继承值进行修改
在线程a中:1508210392057对继承值进行修改
在线程a中:1508210392057对继承值进行修改
是不是有一个疑问,为什么子线程能获取父线程的数据?
我们可以看到inheritablethreadlocal重写了getmap方法和createmap方法,上一节讲threadlocal的时候我们知道,threadlocal的值是存储在一个叫threadlocals的变量中,但是现在返回一个inheritablethreadlocals,这个变量和threadlocals是一模一样的只是名字换了,那么究竟 为什么在新的 线程中 通过 threadlocal.get() 方法还能得到值呢?
我们看childvalue方法可以猜测到可能在线程创建的时候,做了一些手脚,做了一些值得传递。
我们打开thread类的源码的时候可以发现 :
threadlocal.threadlocalmap inheritablethreadlocals = null;
所以当我们创建一个子线程的时候,他就存在一个和threadlocals的一样的inheritablethreadlocal变量,再往下看:
private void init(threadgroup g, runnable target, string name, long stacksize, accesscontrolcontext acc, . . if (inheritthreadlocals && parent.inheritablethreadlocals != null) this.inheritablethreadlocals = threadlocal.createinheritedmap(parent.inheritablethreadlocals);
重点是以下这段代码:
if (inheritthreadlocals && parent.inheritablethreadlocals != null) this.inheritablethreadlocals = threadlocal.createinheritedmap(parent.inheritablethreadlocals);
继续看:
static threadlocalmap createinheritedmap(threadlocalmap parentmap) { return new threadlocalmap(parentmap); }
private threadlocalmap(threadlocalmap parentmap) { entry[] parenttable = parentmap.table; int len = parenttable.length; setthreshold(len); table = new entry[len]; for (int j = 0; j < len; j++) { entry e = parenttable[j]; if (e != null) { @suppresswarnings("unchecked") threadlocal<object> key = (threadlocal<object>) e.get(); if (key != null) { object value = key.childvalue(e.value); entry c = new entry(key, value); int h = key.threadlocalhashcode & (len - 1); while (table[h] != null) h = nextindex(h, len); table[h] = c; size++; } } } }
有这段代码,先得到父线程(也就是当前执行的线程)的值,然后用for循环一个个的将父线程中的值放入我们新创建的值中。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
java多线程编程之InheritableThreadLocal
-
Java多线程之显示锁和内置锁总结详解
-
Java多线程之readwritelock读写分离的实现代码
-
Java多线程编程之CountDownLatch同步工具使用实例
-
java多线程之定时器Timer的使用详解
-
多线程编程之join()方法 博客分类: 线程 java线程多线程join编程
-
多线程编程之卫生间 博客分类: 线程 java线程并发厕所卫生间
-
多线程编程之理财 博客分类: 线程 java多线程理财生产者消费者
-
多线程编程之存钱与取钱 博客分类: 线程 java多线程存钱取钱thread
-
多线程编程之理财 博客分类: 线程 java多线程理财生产者消费者