1.先看一个父线程开启子线程,ThreadLocal获取不到父线程的值的问题。
public class Test {
public static void main(String[] args) {
ExecutorService service = Executors.newSingleThreadExecutor();
final ThreadLocal<Integer> local1 = new ThreadLocal<Integer>();
service.execute(new Runnable() {
@Override
public void run() {
local1.set(1);
System.err.println(local1.get());
// 开启子线程
new Thread() {
public void run() {
// 由于是新开的线程, 所以这里打印为null
System.err.println(local1.get());
};
}.start();
}
});
}
}
//------------打印结果
1
null
统计链路时,经常会重新开启子线程,但是这样就会拿不到父线程里面设置的链路执行情况。
解决办法:
public class Test {
public static void main(String[] args) {
ExecutorService service = Executors.newSingleThreadExecutor();
final ThreadLocal<Integer> local1 = new TransmittableThreadLocal<Integer>();
service.execute(new Runnable() {
@Override
public void run() {
local1.set(1);
System.err.println(local1.get());
// 开启子线程
new Thread() {
public void run() {
// 由于使用了TransmittableThreadLocal ,这里拿到了父线程设置的1
System.err.println(local1.get());
};
}.start();
}
});
}
}
//-------打印结果
1
1