[英]Java Cached thread pool and thread local
我有一個關於 Java 和並發的問題。
假設我有一個名為“a”的 ThreadLocal 變量。 我使用 CachedThreadPool 來獲取新線程。 當線程被重用時,ThreadLocal 變量“a”會發生什么變化? 它保持相同的值(因為它是同一個線程)還是從空開始(好像線程是新的)?
默認情況下,ThreadLocals 與線程一起重用。 如果您需要重新初始化它們,您可以通過覆蓋下面提到的方法來實現:
來自 java.util.concurrent.ThreadPoolExecutor 的 javadoc
Hook 方法該類提供了受保護的可覆蓋 beforeExecute(java.lang.Thread, java.lang.Runnable) 和 afterExecute(java.lang.Runnable, java.lang.Throwable) 方法,這些方法在每個任務執行之前和之后調用。 這些可用於操作執行環境; 例如,重新初始化 ThreadLocals、收集統計信息或添加日志條目。 此外,可以覆蓋方法 terminate() 以執行任何需要在 Executor 完全終止后完成的特殊處理。 如果鈎子或回調方法拋出異常,內部工作線程可能會失敗並突然終止。
您可以使用反射清除線程的線程本地池。 你可以做
public static void clearAllThreadLocals() {
try {
Field threadLocals = Thread.class.getDeclaredField("threadLocals");
threadLocals.setAccessible(true);
threadLocals.set(Thread.currentThread(), null);
} catch (Exception e) {
throw new AssertionError(e);
}
}
如果線程返回到池中,ThreadLocal 變量仍將附加到它。 在池中使用 ThreadLocals 時,您必須小心才能在線程從池中拉出時進行設置,並在返回之前取消設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.