2015-05-19 25 views
7

Czy zawartość przechowywana w pamięci masowej ThreadLocal podczas wykonywania zostanie wyczyszczona automatycznie, gdy wątek zostanie zwrócony do ThreadPool (zgodnie z oczekiwaniami)?Czy obiekt ThreadLocal zostanie wyczyszczony po powrocie wątku do puli wątków?

W moim zgłoszeniu umieszczam niektóre dane w ThreadLocal podczas niektórych wykonań, ale jeśli następnym razem zostanie użyty ten sam wątek, znajduję przestarzałe dane w pamięci masowej ThreadLocal.

+2

Czy nie odpowiadając na własne pytanie? Mówisz: "jeśli używasz tego samego wątku, to znajduję przestarzałe dane". Jakie jest twoje pytanie? – GhostCat

+0

Jaka pula wątków? – erickson

Odpowiedz

6

ThreadLocal i ThreadPool nie współdziałają ze sobą, chyba że to zrobisz.

Co można zrobić, to pojedyncza właściwość ThreadLocal, która przechowuje cały stan, który ma być przechowywany i ma być resetowany po ukończeniu zadania. Można zastąpić ThreadPoolExecutor.afterExecute (lub beforeExecute) wyczyścić ThreadLocal (y)

Od ThreadPoolExecutor

/** 
* Method invoked upon completion of execution of the given Runnable. 
* This method is invoked by the thread that executed the task. If 
* non-null, the Throwable is the uncaught {@code RuntimeException} 
* or {@code Error} that caused execution to terminate abruptly. 
* 
* <p>This implementation does nothing, but may be customized in 
* subclasses. Note: To properly nest multiple overridings, subclasses 
* should generally invoke {@code super.afterExecute} at the 
* beginning of this method. 
* 
... some deleted ... 
* 
* @param r the runnable that has completed 
* @param t the exception that caused termination, or null if 
* execution completed normally 
*/ 
protected void afterExecute(Runnable r, Throwable t) { } 

Zamiast śledzić wszystkie ThreadLocals, można usunąć je wszystkie naraz.

protected void afterExecute(Runnable r, Throwable t) { 
    // you need to set this field via reflection. 
    Thread.currentThread().threadLocals = null; 
} 
+1

gość ... a co jeśli 'ThreadPoolExecutor' używa niektórych lokalnych zmiennych wątku. – ZhongYu

3

No. W zasadzie, kto umieścić coś w wątku lokalnej powinien być odpowiedzialny, aby usunąć to

threadLocal.set(...); 
try { 
    ... 
} finally { 
    threadLocal.remove(); 
}