首页 > 编程语言 >java子线程中获取父线程的threadLocal中的值

java子线程中获取父线程的threadLocal中的值

时间:2023-06-03 17:15:09浏览次数:37  
标签:inheritableThreadLocals java Thread ThreadLocal threadLocal 线程 public

 1 package com.example.springbootstudy.test.threadLocal;
 2 
 3 public class BaseTest {
 4 
 5     public static final InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<>();
 6 
 7     public static final ThreadLocal<String> threadLocal = new ThreadLocal<>();
 8 
 9     public static void main(String[] args) {
10         inheritableThreadLocal.set("Inheritable hello");
11         threadLocal.set("hello");
12 
13         new Thread(() -> {
14             System.out.println(String.format("子线程可继承值:%s", inheritableThreadLocal.get()));
15             System.out.println(String.format("子线程值:%s", threadLocal.get()));
16 
17             new Thread(() -> {
18                 System.out.println(String.format("孙子线程可继承值:%s", inheritableThreadLocal.get()));
19                 System.out.println(String.format("孙子线程值:%s", threadLocal.get()));
20             }).start();
21         }).start();
22 
23         System.out.println(String.format("主线程-inheritableThreadLocal:%s", inheritableThreadLocal.get()));
24         System.out.println(String.format("主线程-threadLocal:%s", threadLocal.get()));
25     }
26 
27 }

运行结果如下所示:

子线程可继承值:Inheritable hello
主线程-inheritableThreadLocal:Inheritable hello
子线程值:null
主线程-threadLocal:hello
孙子线程可继承值:Inheritable hello
孙子线程值:null

InheritableThreadLocal 是如何做到的呢?
我们先看下类结构

public class Thread{
     ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
}

public class InheritableThreadLocal<T> extends ThreadLocal<T> {
    ThreadLocalMap getMap(Thread t) {
       return t.inheritableThreadLocals;
    }
    void createMap(Thread t, T firstValue) {
        t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue);
    }
}
    

这里重写了ThreadLocal的操作ThreadLocalMap的方法,其实就是把从Thread类操作threadLocals变量,切换到inheritableThreadLocals变量上。
这不就是跟ThreadLocal一样吗?只是换了个变量名! 但是实际上Thread类初始化时还有一些骚操作,请看:

 1 public class Thread{
 2     public Thread(){
 3         if (inheritThreadLocals && parent.inheritableThreadLocals != null)
 4             this.inheritableThreadLocals = ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
 5     }
 6 }
 7 
 8 //ThreadLocal 类里的方法
 9    static ThreadLocalMap createInheritedMap(ThreadLocalMap parentMap) {
10         return new ThreadLocalMap(parentMap);
11     }

这里判断父线程的inheritableThreadLocals有值, 就拷贝到当前子线程的inheritableThreadLocals , 这样我们就能在子线程获取到父线程的值了。
这里要注意的是,并不是复制的指针,而是复制了副本。你在子线程重新set值后, 并不会影响父线程的值。

标签:inheritableThreadLocals,java,Thread,ThreadLocal,threadLocal,线程,public
From: https://www.cnblogs.com/jelly12345/p/17454229.html

相关文章

  • Java8之Stream的学习
    一、概念理解Stream可以由数组或集合创建,对流的操作分为两种:中间操作,每次返回一个新的流,可以有多个。终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值。二、Stream的创建publicclassStreamDemo{publicstaticvoidmain(......
  • java继承
    1.为什么要使用继承多类之间拥有相同的属性或是方法;解决方式是将相同的属性和方法抽取出来封装到一个新的类中,并继承新的类。2.继承语法AextendsB如果AextendsB得出结论;A是B的子类;B是A的父类java中一个类只能继承一个父类(单继承关系)继承的关键字是extends3.supersupe......
  • 【python】多线程
     在Python3中,通过threading模块提供线程的功能。原来的thread模块已废弃。但是threading模块中有个Thread类(大写的T,类名),是模块中最主要的线程类,一定要分清楚了,千万不要搞混了。threading模块提供了一些比较实用的方法或者属性,例如:方法与属性描述current_thread()返......
  • Java使用SSLContext请求https
    //首先实现信任的管理器类ublic class HttpsUtil {     private static class TrustAnyTrustManager implements X509TrustManager {         public void checkClientTrusted(X509Certificate[] chain, String authType)          ......
  • JAVA的springboot+vue医疗预约服务管理信息系统,医院预约管理系统,附源码+数据库+论文+P
    1、项目介绍会员制医疗预约服务管理信息系统是针对会员制医疗预约服务管理方面必不可少的一个部分。在会员制医疗预约服务管理的整个过程中,会员制医疗预约服务管理系统担负着最重要的角色。为满足如今日益复杂的管理需求,各类的管理系统也在不断改进。本课题所设计的是会员制医疗......
  • Java High Level Rest Client---操作索引库
    操作索引库初始化RestClient引入es的RestHighLevelClient依赖:点击查看代码<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.12.1</version>......
  • Java High Level Rest Client---操作文档
    新增文档1)创建Request对象2)准备请求参数,也就是DSL中的JSON文档3)发送请求代码示例:点击查看代码//新增文档@TestpublicvoidaddDoc()throwsException{//根据id查出酒店数据Hotelhotel=iHotelService.getById(36934L);//将酒店......
  • 集合,多线程,面向对象,方法覆盖
    集合:“父亲”collection"儿子":list:有序,有下标,查set:无序,无下标,修改(底层:内存存储方式)列表,不方便map:键值对,key(标号)-value(真实的值,储放的是分散的物品,小型数据库)多线程:进程(可以索取计算机运行资源)=多线程(不可以索取,只能进程的资源)oop面向对象=封装,继承,多态面向过程:按照......
  • javassist动态生成类
    1. 使⽤javassist⽣成类   58来⾃百度百科:Javassist是⼀个开源的分析、编辑和创建Java字节码的类库。是由东京⼯业⼤学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加⼊了开放源代码JBoss 应⽤服务器项⽬,通过使⽤Javassist对字节码操作为JBoss实现动态"AO......
  • JavaScript学习笔记:浏览器事件
    概念客户端JavaScript程序使用异步事件驱动的编程模型。浏览器会在文档、浏览器或某些元素或与之关联的对象发生某些事情时生成事件对象。比如文档加载完成、敲击键盘输入等。JavaScript程序可以给某些对象绑定监听器函数来监听特定的事件,在该对象上发生指定事件时,这些函数会被......