簡體   English   中英

Java緩存線程池和線程本地

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM