返回ThreadPool时清除ThreadLocal值

时间:2013-07-26 07:56:04

标签: java multithreading threadpool

从线程池中重用Thread时,我们从线程的最后一次执行中获取线程局部变量值。

我理解Thread local是Thread的一部分,所以当我们使用Thread pool时它会被重用。但我的问题是我不想在上次执行中使用线程局部变量集(对许多人来说是有效的用例)。

当线程在当前执行后进入池时,有没有更好的方法来清除线程本地值?

3 个答案:

答案 0 :(得分:2)

无法使用公共API清除ThreadLocals。尽管如此,ThreadPoolExecutor有一个钩子方法,我们可以在执行前使用反射清除线程中的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;
    ...   

答案 1 :(得分:1)

您可以使用反射清除线程的线程本地映射。这将清除所有线程本地人,无论他们在哪里。

理想情况下,您应该编写代码,以便您的线程本地不像这样。这意味着单元测试更加困难。

答案 2 :(得分:1)

清除ThreadLocal应该是“线程用户”的责任 - 也就是说,将ThreadLocal放在适当位置的代码也应该清除它。使用例如一个try-finally-block来确保这种情况发生。

但是,你可以破解你想要的东西!说真的,这并不困难 - 你只需要反省你进入Thread对象/类的方法,找到ThreadLocals所在的Map,并清除它。