java 如何得到子线程_子线程如何获取父线程的ThreadLocal变量

之前面试的时候,当谈到ThreadLocal时,被人问到,在子线程中如何获取父线程的ThreadLocal里面存储的变量。今天看到了一个类InheritableThreadLocal才明白原来是这样来做的。

先来看一下InheritableThreadLocal的源码。

public class InheritableThreadLocal extends ThreadLocal {

/**

* Computes the child's initial value for this inheritable thread-local

* variable as a function of the parent's value at the time the child

* thread is created. This method is called from within the parent

* thread before the child is started.

*

* This method merely returns its input argument, and should be overridden

* if a different behavior is desired.

*

* @param parentValue the parent thread's value

* @return the child thread's initial value

*/

protected T childValue(T parentValue) {

return parentValue;

}

/**

* Get the map associated with a ThreadLocal.

*

* @param t the current thread

*/

ThreadLocalMap getMap(Thread t) {

return t.inheritableThreadLocals;

}

/**

* Create the map associated with a ThreadLocal.

*

* @param t the current thread

* @param firstValue value for the initial entry of the table.

*/

void createMap(Thread t, T firstValue) {

t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue);

}

}

可以看到,它继承自ThreadLocal,既然有了ThreadLocal,为什么还要弄这么个类出来呢,原因就是通过这个类可以帮我们在子线程中获取到父线程的ThreadLocal变量。

下面来演示对比一下。

public class TestThreadLocal {

private static ThreadLocal T = new ThreadLocal();

public static void main(String[] args) {

T.set("23abc");

System.out.println("main" + T.get());

new Thread(() -> System.out.println("sub" + T.get())).start();

}

}

输出

main23abc

subnull

然后我们将ThreadLocal换成InheritableThreadLocal

然后再次输出

main23abc

sub23abc

可以看到,子线程已经拿到了父线程的ThreadLocal里面的值了。

本文地址:https://blog.csdn.net/weixin_41751625/article/details/107357016

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值