ThreadLocal和InheritableThreadLocal使用
2024-09-01 06:15:30
InheritableThreadLocal代码
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);
}
}
测试代码
import java.util.concurrent.atomic.AtomicInteger; /**
* Created by hujunzheng on 2017/6/23.
*/ class ThreadCount {
private static final AtomicInteger nextId = new AtomicInteger(0);
private static final ThreadLocal<Integer> threadCount =
ThreadLocal.withInitial(() -> nextId.getAndIncrement());//返回的是重写了ThreadLocal initialValue()方法的ThreadLocal.SuppliedThreadLocal对象 public static int get() {
return threadCount.get();
}
} class ThreadSign {
private static final AtomicInteger nextId = new AtomicInteger(0);
private static final ThreadLocal<Integer> threadCount = new InheritableThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return nextId.getAndIncrement();
}
}; public static int get() {
return threadCount.get();
}
} public class ThreadLocalTest { public static void testThreadLocal() {
for (int i = 0; i < 5; ++i) {
int pi = i;
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " count->" + ThreadCount.get());
for (int j = 0; j < 5; ++j) {
new Thread(() -> System.out.println(" " + Thread.currentThread().getName() + " count->" + ThreadCount.get()), "cthread" + j + " pthread" + pi).start();
}
}, "pthread" + i).start();
}
} public static void testInheritableThreadLocal() {
for(int i=0; i<5; ++i) {
int pi = i;
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " sign->" + ThreadSign.get());
for(int j=0; j<5; ++j) {
new Thread(() -> System.out.println(" " + Thread.currentThread().getName() + " sign->" + ThreadSign.get()), "cthread" + j + " pthread" + pi).start();
}
}, "pthread" + i).start();
}
} public static void main(String[] args) {
// testThreadLocal();
testInheritableThreadLocal();
}
}
测试结果
分别为testThreadLocal() 和 testInheritableThreadLocal() 测试结果。
比较后,看到ThreadLocal里的值,子线程里不能获得;InheritableThreadLocal里的值,子线程可以获得。
跟踪一下代码
参考
Java8增加功能--Effectively final 功能
最新文章
- mybatis, spring, springmvc
- 详解spring 每个jar的作用
- Android缓存学习入门
- IplImage, CvMat, Mat 的关系
- Windows操作系统消费者价值亮点
- 实验四 时序逻辑电路的VHDL设计
- hdu 2047
- 网易音乐API
- 关于java异常的一点思考
- SQLSERVER中返回修改后的数据
- c# serialport读取不限数量的16进制数据
- Android游戏开发研究帧动画实现
- ●BZOJ 3994 [SDOI2015]约数个数和
- TypeError: parse() got an unexpected keyword argument &#39;transport_encoding&#39;
- tesseract 中文二次训练
- eigen 笔记1
- codeforces 766E Mahmoud and a xor trip
- 2018.08.31 10:57 swift 学习心得
- Qt跨线程调用错误解析及解决办法
- MyISAM重启之后的一次血泪教训