ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal 区别,使用场景 示例

总结:
ThreadLocal:set,get 需要再同一个线程中执行,父子线程不支持
InheritableThreadLocal:支持父子线程,不支持线程池
TransmittableThreadLocal :以上都支持

代码示例
1 pom.xml

<!-- 阿里线程传递值 --><dependency><groupId>com.alibaba</groupId><artifactId>transmittable-thread-local</artifactId><version>2.14.3</version></dependency>

2 ThreadLocal,InheritableThreadLocal 对比

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.TimeUnit;public class InheritableThreadLocalExample {static Logger logger = LoggerFactory.getLogger(InheritableThreadLocalExample.class);/*** 输出结果*  [main] [traceId:] - userName:张三*  [thread1] [traceId:] - userName:null* @throws InterruptedException*/private static void threadLocalTest() throws InterruptedException {ThreadLocal<String> userNameTL = new ThreadLocal<>();//这里是主线程,ThreadLocal中设置了值:张三userNameTL.set("张三");logger.info("userName:{}", userNameTL.get());//创建了一个子线程thread1,在子线程中去ThreadLocal中拿值,能否拿到刚才放进去的“张三”呢?new Thread(() -> {logger.info("userName:{}", userNameTL.get());}, "thread1").start();TimeUnit.SECONDS.sleep(1);}/*** 输出结果*  [main] [traceId:] - userName:张三*  [thread1] [traceId:] - userName:张三** @throws InterruptedException*/private static void inheritableThreadLocal() throws InterruptedException {InheritableThreadLocal<String> userNameItl = new InheritableThreadLocal<>();//这里是主线程,使用 InheritableThreadLocal.set 放入值:张三userNameItl.set("张三");logger.info("userName:{}", userNameItl.get());//创建了一个子线程thread1,在子线程中去ThreadLocal中拿值,能否拿到刚才放进去的“张三”呢?new Thread(() -> {logger.info("userName:{}", userNameItl.get());}, "thread1").start();TimeUnit.SECONDS.sleep(1);}public static void main(String[] args) throws InterruptedException {threadLocalTest();System.out.println();inheritableThreadLocal();}
}

3 InheritableThreadLocal ,TransmittableThreadLocal  对比

import com.alibaba.ttl.TransmittableThreadLocal;
import com.alibaba.ttl.threadpool.TtlExecutors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class TransmittableThreadLocalExample {static Logger logger = LoggerFactory.getLogger(TransmittableThreadLocalExample.class);/*** 输出结果*  [main] [traceId:] - userName:张三*  [pool-1-thread-1] [traceId:] - 第1次获取 userName:张三*  [main] [traceId:] - userName:李四*  [pool-1-thread-1] [traceId:] - 第2次获取 userName:张三** @throws InterruptedException*/private static void fangfa_Inheri_test() throws InterruptedException {InheritableThreadLocal<String> userNameTtl = new InheritableThreadLocal<String>();// 为了看到效果,这里创建大小为1的线程池,注意这里为1才能方便看到效果ExecutorService executorService = Executors.newFixedThreadPool(1);// 主线程中设置 张三userNameTtl.set("张三");logger.info("userName:{}", userNameTtl.get());// 在线程池中通过 TransmittableThreadLocal 拿值,看看能否拿到 刚才放入的张三?executorService.execute(() -> {logger.info("第1次获取 userName:{}", userNameTtl.get());});TimeUnit.SECONDS.sleep(1);// 这里放入了李四userNameTtl.set("李四");logger.info("userName:{}", userNameTtl.get());// 在线程池中通过 TransmittableThreadLocal 拿值,看看能否拿到 刚才放入的李四?executorService.execute(() -> {// 在线程池中通过 inheritableThreadLocal 拿值,看看能否拿到?logger.info("第2次获取 userName:{}", userNameTtl.get());});TimeUnit.SECONDS.sleep(1);}/*** 输出结果*  [main] [traceId:] - userName:张三*  [pool-1-thread-1] [traceId:] - 第1次获取 userName:张三*  [main] [traceId:] - userName:李四*  [pool-1-thread-1] [traceId:] - 第2次获取 userName:李四** @throws InterruptedException*/private static void fangfa_Transmit_test() throws InterruptedException {TransmittableThreadLocal<String> userNameTtl = new TransmittableThreadLocal<String>();// 为了看到效果,这里创建大小为1的线程池,注意这里为1才能方便看到效果ExecutorService executorService = Executors.newFixedThreadPool(1);// 这里需要用 TtlExecutors.getTtlExecutorService 将原线程池包装下executorService = TtlExecutors.getTtlExecutorService(executorService);// 主线程中设置 张三userNameTtl.set("张三");logger.info("userName:{}", userNameTtl.get());// 在线程池中通过 TransmittableThreadLocal 拿值,看看能否拿到 刚才放入的张三?executorService.execute(() -> {logger.info("第1次获取 userName:{}", userNameTtl.get());});TimeUnit.SECONDS.sleep(1);// 这里放入了李四userNameTtl.set("李四");logger.info("userName:{}", userNameTtl.get());// 在线程池中通过 TransmittableThreadLocal 拿值,看看能否拿到 刚才放入的李四?executorService.execute(() -> {// 在线程池中通过 inheritableThreadLocal 拿值,看看能否拿到?logger.info("第2次获取 userName:{}", userNameTtl.get());});TimeUnit.SECONDS.sleep(1);}public static void main(String[] args) throws InterruptedException {fangfa_Inheri_test();System.out.println();fangfa_Transmit_test();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1541103.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

AI大模型站在十字路口,持续突破or陷入低谷?

文&#xff5c;白 鸽 编&#xff5c;王一粟 当普通人被AI轰炸的已经疲劳&#xff0c;应用落地也没有惊人地突破&#xff0c;AI大模型的发展似乎已经进入瓶颈期。 在云栖大会之前&#xff0c;业界弥漫着对AI的唱衰&#xff0c;似乎又到了一个历史的转折点。如2017年上一代深度…

MySQL的索引——提高查找算法的数据结构 B+树

我们MYSQL服务器是在内存中的&#xff0c;所以所有的操作也是内存级的&#xff0c;索引也是如此 我们要提高算法的效率&#xff1a;首先要用一个好的数据存储结构储存数据&#xff0c;然后结构决定算法 所以——索引的本质就是一种提高算法效率组织的数据结构 缩印的主要价值体…

如何使用 React、TypeScript、TailwindCSS 和 Vite 创建 Chrome 插件

创建一个 Chrome 插件是一个有趣的项目&#xff0c;特别是当结合使用强大的工具如 React、TypeScript、TailwindCSS 和 Vite 时 在这篇文章中&#xff0c;我们将逐步引导完成整个过程&#xff0c;了解如何在 2024 年构建自己的 Chrome 插件。无论是经验丰富的开发者还是刚刚起…

Kafka 为什么这么快?

Kafka 是一款性能非常优秀的消息队列&#xff0c;每秒处理的消息体量可以达到千万级别。今天来聊一聊 Kafka 高性能背后的技术原理。 1 批量发送 Kafka 收发消息都是批量进行处理的。我们看一下 Kafka 生产者发送消息的代码&#xff1a; private Future<RecordMetadata>…

Mysql进阶——1

一.MySQL程序简介 本章介绍 MySQL 命令⾏程序以及在运⾏这些程序时指定选项的⼀般语法。 对常⽤程序进⾏详细的讲解&#xff0c;包括它们的选项。 MySQL安装完成通常会包含如下程序&#xff1a; • Linux系统程序⼀般在 /usr/bin⽬录下&#xff0c;可以通过命令查看&#x…

MySQL篇(索引)(持续更新迭代)

目录 一、简介 二、有无索引情况 1. 无索引情况 2. 有索引情况 3. 优劣势 三、索引结构 1. 简介 2. 存储引擎对于索引结构的支持情况 3. 为什么InnoDB默认的索引结构是Btree而不是其它树 3.1. 二叉树&#xff08;BinaryTree&#xff09; 3.2. 红黑树&#xff08;RB&a…

让模型评估模型:构建双代理RAG评估系统的步骤解析

在当前大语言模型(LLM)应用开发的背景下,一个关键问题是如何评估模型输出的准确性。我们需要确定哪些评估指标能够有效衡量提示(prompt)的效果,以及在多大程度上需要对提示进行优化。 为解决这一问题,我们将介绍一个基于双代理的RAG(检索增强生成)评估系统。该系统使用生成代理…

MySQL练手题--日期连续类型(困难)

一、准备工作 Create table If Not Exists Failed (fail_date date); Create table If Not Exists Succeeded (success_date date); Truncate table Failed; insert into Failed (fail_date) values (2018-12-28); insert into Failed (fail_date) values (2018-12-29); inser…

攻防世界-1-misc

下载附件&#xff0c;提示需要密码 提示密码是出题人的生日&#xff0c;这里可以自己定义一个关于生日的字典&#xff0c;使用字典生成工具&#xff0c;直接生成字典。&#xff08;我用的是19000101至20231231字典进行的爆破测试&#xff09; 使用archpr软件&#xff0c;和刚刚…

k8s下的网络通信与调度

目录 一、k8s网络通信 1、k8s通信整体架构 2、flannel网络插件 &#xff08;1&#xff09;flannel跨主机通信原理 &#xff08;2&#xff09;flannel支持的后端模式 3、calico网络插件 &#xff08;1&#xff09;简介 &#xff08;2&#xff09;网络架构 &#xff08;…

Css_动态渐变圆圈旋转效果

1、效果图 2、实现代码 <template><div class"box"><div class"line"></div><div class"lineNew"></div></div> </template><script lang"ts" setup></script><styl…

C语言 | Leetcode C语言题解之第421题数组中两个数的最大异或值

题目&#xff1a; 题解&#xff1a; const int HIGH_BIT 30;struct Trie {// 左子树指向表示 0 的子节点struct Trie* left;// 右子树指向表示 1 的子节点struct Trie* right; };struct Trie* createTrie() {struct Trie* ret malloc(sizeof(struct Trie));ret->left re…

天润融通创新功能,将无效会话转化为企业新商机

“您好&#xff0c;请问有什么可以帮您&#xff1f;” “......” 一个新的咨询会话进来&#xff0c;但客户却并不说话&#xff0c;这种情况客服人员肯定不会陌生&#xff0c;它一般被称为“无效会话”。 如今“无效会话”越来越多&#xff0c;已经成为困扰无数企业的难题。…

数学建模 第二讲 - 初等建模

绪论 主要内容:介绍以下几个初等模型&#xff0c;椅子问题、席位分配问题、行走步长问题、实物交换模型。 主要目的:体会数学建模的形式多样性与方法多样性&#xff0c;了解建模思想&#xff0c;着重理解由现实问题向数学问题的转化过程。 一、椅子问题 问题 四条腿长度相等…

Flat File端口更新:如何实现嵌套结构

Flat File端口可以实现平面文件和XML文件的互相转换&#xff0c;本文主要介绍在知行之桥EDI系统8971及更高版本中&#xff0c;Flat File端口如何支持类似EDI嵌套结构的转换。 Flatfile端口如何自定义嵌套结构 下载示例工作流以及示例文件 打开知行之桥EDI系统&#xff0c;创建…

2024年中国研究生数学建模竞赛ABCDEF题【附带解题思路代码+结果】

2024年中国研究生数学建模竞赛D题 点击链接加入群聊【2024华为杯数学建模助攻资料】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&kxtS4vwn3gcv8oCYYyrqd0BvFc7tNfhV7&authKeyedQFZne%2BzvEfLEVg2v8FOm%2BWNg1V%2Fiv3H4tcE6X%2FW6lCmkhaSaZV4PwQ%2FOVPDtF%2B…

css实现居中的方法

水平居中 1. 行内设置text-align 给父元素设置text-align为center&#xff0c;一般用于实现文字水平居中 2. 给当前元素设置margin&#xff1a;0 auto 原理&#xff1a;块级独占一行&#xff0c;表现为在水平方向上占满整个父容器&#xff0c;当水平方向padding&#xff0c;…

算法-Init

&#xff08;1&#xff09;有限性&#xff08;Finiteness&#xff09;&#xff1a;算法必 需在有限步骤内结束&#xff1b; &#xff08;2&#xff09;确定性&#xff08;Definiteness&#xff09;&#xff1a;算法的每一个步骤必须清晰无歧义地定义&#xff1b; &#xff08;3…

2024年Q3国际信息系统安全认证联盟(ISC2)内部研讨会要点分享

2024年是CISSP认证成立30周年&#xff0c;这是一项具有里程碑意义的成就&#xff0c;代表了CISSP在网络安全领域的卓越、创新和领导力。博主于今年9月份参加了ISC2&#xff08;国际信息系统安全认证联盟&#xff09;组织的2024年第3季度内部网络研讨会&#xff0c;针对会议中的…

国标视频流媒体服务GB28181和Ehome等多协议接入的Liveweb方案详解

Liveweb视频融合/汇聚云平台基于“云-边-端”一体化架构&#xff0c;部署轻量简单、功能灵活多样&#xff0c;平台可支持多协议&#xff08;GB28181/RTSP/Onvif/海康SDK/Ehome/大华SDK/RTMP推流等&#xff09;、多类型设备接入(IPC/NVR/监控平台)&#xff0c;在视频能力上&…