从线程池重用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/

10-11 16:05