java 多线程 :ThreadLocal 共享变量多线程不同值方案;InheritableThreadLocal变量子线程中自定义值,孙线程可继承
ThreadLocal类的使用
变量值的共享可以使用public static变量的形式,所有的线程都是用同一个public static变量。如果想实现每一个线程都有自己的值。该变量可通过ThreadLocal实现
- 用法1、变量在线程外定义,在线程执行体内.set()赋值。
- 用法2、变量在定义时设置自动赋值的方法。在对应线程中运行时则自动赋值。
ThreadLocal<T> name = new ThreadLocal<>(){
@Override
protected String initialValue() {
return <T> t;
}
};
取值:.get()
用法1示例:
import javax.management.relation.RelationNotFoundException; /**
* @ClassName ThreadLocalExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/24.
*/
public class ThreadLocalExample {
private static ThreadLocal<String> name = new ThreadLocal<>(); public static void main(String[] args) {
Runnable r = () -> {
String threadname = Thread.currentThread().getName();
/**
* 线程运行时赋值
*/
name.set(threadname);
System.out.println(name.get()); //不同的子线程对应子线程名,本例A\B\C
};
Thread thread = new Thread(r,"A");
Thread thread2 = new Thread(r,"B");
Thread thread1 = new Thread(r,"C");
thread.start();
thread1.start();
thread2.start();
System.out.println(name.get()); //主线程中没有赋值默认为null
}
}
用法二示例:
/**
* @ClassName ThreadLocalInitialValue
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/24.
*/
public class ThreadLocalInitialValue {
/**
* 定义ThreadLocal变量线程中运行自动初始化值
*/
private static ThreadLocal<String> name = new ThreadLocal<>(){
@Override
protected String initialValue() {
return Thread.currentThread().getName();
}
};
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("我是" + name.get());
}
};
Thread zhangsan = new Thread(r,"张三");
Thread lisi = new Thread(r,"李四");
zhangsan.start();
lisi.start();
System.out.println("main线程中,我是" + name.get());
}
}

InheritableThreadLocal子线程中自定义值,孙线程可继承
import java.io.Reader;
import java.sql.SQLOutput; /**
* @ClassName ThreadLocalSubThread
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/24.
*/
public class ThreadLocalSubThread {
/**
* 定义变量时,设置自动赋值方法
*/
private static ThreadLocal<String> name = new InheritableThreadLocal<>(){
@Override
protected String initialValue() {
return Thread.currentThread().getName();
}
}; public static void main(String[] args) {
Runnable r = () -> {
System.out.println("我是子线程:"+ name.get());//我是子线程:child
Thread t = new Thread(){
@Override
public void run() {
System.out.println("我是孙线程,获取子线程变量值:"+ name.get());//也是child
}
};
t.start();
};
Thread thread = new Thread(r,"child");
thread.start();
name.set("主线程"); //主线程中手动赋值
System.out.println("main线程中 name:" + name.get()); //"主线程"
}
}

java 多线程 :ThreadLocal 共享变量多线程不同值方案;InheritableThreadLocal变量子线程中自定义值,孙线程可继承的更多相关文章
- 在Java 线程中返回值的用法
http://icgemu.iteye.com/blog/467848 在Java 线程中返回值的用法 博客分类: Java Javathread 有时在执行线程中需要在线程中返回一个值:常规中我们 ...
- 业务代码中(java class)中如何实现多线程,并且将子线程中的值随方法返回返回值
转载自http://bbs.csdn.net/topics/390731832 问题: public static String getAddress(final InputStream inputS ...
- 零基础学习java------day18------properties集合,多线程(线程和进程,多线程的实现,线程中的方法,线程的声明周期,线程安全问题,wait/notify.notifyAll,死锁,线程池),
1.Properties集合 1.1 概述: Properties类表示了一个持久的属性集.Properties可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 一个属性列表可包含另 ...
- Java多线程ThreadLocal介绍
在Java多线程环境下ThreadLocal就像一家银行,每个线程就是银行里面的一个客户,每个客户独有一个保险箱来存放金钱,客户之间的金钱不影响. private static ThreadLocal ...
- Java基础】并发 - 多线程
Java基础]并发 - 多线程 分类: Java2014-05-03 23:56 275人阅读 评论(0) 收藏 举报 Java 目录(?)[+] 介绍 Java多线程 多线程任务执行 大多数 ...
- Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)
线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...
- Java高并发下多线程编程
1.创建线程 Java中创建线程主要有三种方式: 继承Thread类创建线程类: 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此也把run方法称为 ...
- java基础知识总结--多线程
1.扩展Java.lang.Thread类 1.1.进程和线程的区别: 进程:每个进程都有自己独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1~n个线程. 线程:同一类线 ...
- Java入门教程十三(多线程)
线程的概念 单纯种以一个任务完成以后再进行下一个任务的模式进行,这样下一个任务的开始必须等待前一个任务的结束,只有一个任务完成后才能进行下一个任务.Java 语言提供了并发机制,允许开发人员在程序中执 ...
随机推荐
- 群晖ping自动关机
因为学校宿舍环境的原因,每天早上10点左右宿管可能会来检查内务情况,然后一定会关闭电闸,就导致如果我的nas在10点半时开机的话用的是UPS的电源,直接导致UPS电量耗竭,而我又不可能一直去观察宿舍有 ...
- Codeforces 1455G - Forbidden Value(map 启发式合并+DP)
Codeforces 题面传送门 & 洛谷题面传送门 首先这个 if 与 end 配对的结构显然形成一个树形结构,考虑把这棵树建出来,于是这个程序的结构就变为,对树进行一遍 DFS,到达某个节 ...
- 洛谷 P3750 - [六省联考2017]分手是祝愿(期望 dp)
题面传送门 首先我们需注意到这样一个性质:那就是对于任何一种状态,将其变为全 \(0\) 所用的最小步数的方案是唯一的--考虑编号为 \(n\) 的灯,显然如果它原本是暗着的就不用管它了,如果它是亮着 ...
- BZOJ 3043 [Poetize6] IncDec Sequence
题目描述 给定一个长度为n的数列$a_1,a_2,--,a_n$,每次可以选择一个区间[l,r],使这个区间内的数都加1或者都减1. 请问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最 ...
- GWAS分析结果中pvalue/p.ajust为0时如何处理?
在GWAS分析的结果中,偶尔会遇到到pvalue为0的SNP位点,这时如果直接做曼哈顿或QQ图,会出错,因为log0无意义. 此时,该如何处理? 如果你用的是Plink1.9来做的GWAS,可加一个参 ...
- 关于单倍型和Phasing
单倍型,即单倍体基因型,概念很好理解. 单倍型分型的过程就称之Phasing,定相或基因分型. Phasing的意义,在人类疾病遗传和动植物群体遗传中非常重要.也是imputation的必经过程. v ...
- PHP socket Workerman实用的php框架
PHP socket Workerman是一款开源高性能异步PHP socket即时通讯框架. 非常好用的一款框架,可以支持在线聊天,长连接等 用法 官方 https://www.workerman. ...
- jquery操作html中图片宽高自适应
在网站制作中如果后台上传的图片不做宽高限制,在前台显示的时候,经常会出现图片变形,实用下面方法可以让图片根据宽高自适应,不论是长图片或者高图片都可以完美显示. $("#myTab0_Cont ...
- html5的canvas鼠标点击画圆
<!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...
- 字符scanf 的输入注意
1.注意scanf 不能有空格,如果有空格会将空格给输入进去 scanf("d "):---有空格 和scanf("d");--没有空格 有很大的区别