2015-05-19 6 views
7

Werden die Inhalte, die während einer Ausführung im Speicher ThreadLocal gespeichert sind, automatisch gelöscht, wenn der Thread (wie zu erwarten) an ThreadPool zurückgegeben wird?Wird das ThreadLocal-Objekt gelöscht, nachdem der Thread zum Thread-Pool zurückgegeben wurde?

In meiner Anwendung gebe ich einige Daten in ThreadLocal während einer Ausführung, aber wenn das nächste Mal der gleiche Thread verwendet wird, dann finde ich die veralteten Daten in ThreadLocal Speicher.

+2

Sind Sie nicht Ihre eigene Frage zu beantworten? Sie sagen: "Wenn der gleiche Thread verwendet wird, finde ich veraltete Daten". Also, was ist deine Frage? – GhostCat

+0

Welcher Thread-Pool? – erickson

Antwort

6

Die ThreadLocal und ThreadPool interagieren nicht miteinander, wenn Sie dies tun.

Was Sie tun können, ist ein einzelner ThreadLocal, der den gesamten Zustand speichert, den Sie behalten möchten, und dieser muss zurückgesetzt werden, wenn die Aufgabe abgeschlossen ist. Sie können außer Kraft setzen ThreadPoolExecutor.afterExecute (oder BeforeExecute) Ihre Thread zu löschen (s)

Von 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) { } 

Anstatt zu verfolgen alle ThreadLocals, können Sie sie alle auf einmal löschen können.

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

Kumpel ... und was, wenn 'ThreadPoolExecutor' einige Thread-lokale Variablen verwendet. – ZhongYu

3

Nr Als Prinzip, wer sollte etwas in Faden setzen lokale verantwortlich sein, es zu löschen

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