ThreadLocal可以爲當前線程保存局部變量,而InheritableThreadLocal則可以在創建子線程的時候將父線程的局部變量傳遞到子線程中。
如果使用了線程池(如Executor),那麼即使即使父線程已經結束,子線程依然存在並被池化。這樣,線程池中的線程在下一次請求被執行的時候,ThreadLocal對象的get()方法返回的將不是當前線程中設定的變量,因爲池中的“子線程”根本不是當前線程創建的,當前線程設定的ThreadLocal變量也就無法傳遞給線程池中的線程。
因此,必須將外部線程中的ThreadLocal變量顯式地傳遞給線程池中的線程。