一、使用场景
ThreadLocal是相对于每一个线程自己使用的本地变量,没有使用到子线程的时候可以用ThreadLocal
有这样的一种需求:父线程生成的变量需要传递到子线程中进行使用。
使用到子线程但是没有用到线程池,这个时候可以用InheritableThreadLocal,因为InheritableThreadLocal的使用利用Thread 的初始化
使用线程池的方式这个时候就需要TransmittableThreadLocal登场来解决。
二、案例
public class LocalThreadUtil {
private static ThreadLocal<String> threadLocal = new ThreadLocal<>();
private static InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<>();
private static TransmittableThreadLocal<String> transmittableThreadLocal = new TransmittableThreadLocal<>();
private static ExecutorService executorService = Executors.newSingleThreadExecutor();
public static void main(String[] args) throws InterruptedException {
inheritableThreadLocal.set("old");
CountDownLatch countDownLatch = new CountDownLatch(1);
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("first children =====" + inheritableThreadLocal.get());
countDownLatch.countDown();
}
});
countDownLatch.await();
// 改变inheritableThreadLocal 的值
inheritableThreadLocal.set("update");
CountDownLatch countDownLatch2 = new CountDownLatch(1);
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("second children =====" + inheritableThreadLocal.get());
countDownLatch2.countDown();
}
});
countDownLatch2.await();
System.out.println("main is ==="+inheritableThreadLocal.get());
}
}
结果:
first children =====old
second children =====old
main is ===update
三、TransmittableThreadLocal使用
需要引入jar
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
<version>2.2.0</version>
</dependency>
public class LocalThreadUtil {
private static ThreadLocal<String> threadLocal = new ThreadLocal<>();
private static InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<>();
private static TransmittableThreadLocal<String> transmittableThreadLocal = new TransmittableThreadLocal<>();
private static ExecutorService executorService = Executors.newSingleThreadExecutor();
public static void main(String[] args) throws InterruptedException {
transmittableThreadLocal.set("old");
CountDownLatch countDownLatch = new CountDownLatch(1);
//这里执行的 是TtlRunnable
executorService.execute(TtlRunnable.get(new Runnable() {
@Override
public void run() {
System.out.println("first children =====" + transmittableThreadLocal.get());
countDownLatch.countDown();
}
}));
countDownLatch.await();
transmittableThreadLocal.set("update");
CountDownLatch countDownLatch2 = new CountDownLatch(1);
executorService.execute(TtlRunnable.get(new Runnable() {
@Override
public void run() {
System.out.println("second children =====" + transmittableThreadLocal.get());
countDownLatch2.countDown();
}
}));
countDownLatch2.await();
System.out.println("main is ==="+transmittableThreadLocal.get());
}
}
结果:
first children =====old
second children =====update
main is ===update