从线程池重用Thread时,我们从线程的上一次执行中获取线程局部变量值。
我知道Thread local是Thread的一部分,因此当我们使用Thread Pool时,它会被重用。但是我的问题是我不想在最后一次执行中使用线程局部变量集(对许多人来说是有效的用例)。
当前执行后线程进入池时,还有什么更好的清除线程本地值的方法吗?
最佳答案
无法使用公共(public)API清除ThreadLocals。尽管如此,ThreadPoolExecutor有一个hook方法,我们可以在执行之前使用反射来清除Thread中的ThreadLocals。
public class ThreadPoolExector
protected void beforeExecute(Thread t, Runnable r) {
... set t.threadLocals and t.inheritableThreadLocals fields to null using reflection
}
...
public class Thread
...
ThreadLocal.ThreadLocalMap threadLocals;
ThreadLocal.ThreadLocalMap inheritableThreadLocals;
...
关于java - 返回ThreadPool时清除ThreadLocal值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17875926/