为什么 set 之后,初始化代码就不执行了?
要理解这个问题,需要从 ThreadLocal.get()
方法的源码中得到答案,因为初始化方法 initialValue
在 ThreadLocal
创建时并不会立即执行,而是在调用了 get
方法只会才会执行,测试代码如下:
import java.util.Date; publicclass ThreadLocalByInitExample { // 定义 ThreadLocal privatestatic ThreadLocal<String> threadLocal = new ThreadLocal() { @Override protected String initialValue() { System.out.println("执行 initialValue() 方法 " + new Date()); return"默认值"; } }; public static void main(String[] args) { // 线程执行任务 Runnable runnable = new Runnable() { @Override public void run() { // 得到当前线程名称 String threadName = Thread.currentThread().getName(); // 执行方法,打印线程中设置的值 print(threadName); } }; // 创建并启动线程 1 new Thread(runnable, "MyThread-1").start(); // 创建并启动线程 2 new Thread(runnable, "MyThread-2").start(); } /** * 打印线程中的 ThreadLocal 值 * @param threadName 线程名称 */ private static void print(String threadName) { System.out.println("进入 print() 方法 " + new Date()); try { // 休眠 1s Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 得到 ThreadLocal 中的值 String result = threadLocal.get(); // 打印结果 System.out.println(String.format("%s 取得值:%s %s", threadName, result, new Date())); } }
以上程序的执行结果为:
从上述打印的时间可以看出:initialValue
方法并不是在 ThreadLocal
创建时执行的,而是在调用 Thread.get
方法时才执行的。