1. 程式人生 > >在使用執行緒池時應特別注意對ThreadLocal的使用

在使用執行緒池時應特別注意對ThreadLocal的使用

ThreadLocal可以為當前執行緒儲存區域性變數,而InheritableThreadLocal則可以在建立子執行緒的時候將父執行緒的區域性變數傳遞到子執行緒中。

如果使用了執行緒池(如Executor),那麼即使即使父執行緒已經結束,子執行緒依然存在並被池化。這樣,執行緒池中的執行緒在下一次請求被執行的時候,ThreadLocal物件的get()方法返回的將不是當前執行緒中設定的變數,因為池中的“子執行緒”根本不是當前執行緒建立的,當前執行緒設定的ThreadLocal變數也就無法傳遞給執行緒池中的執行緒。

因此,必須將外部執行緒中的ThreadLocal變數顯式地傳遞給執行緒池中的執行緒。