Java 返回ThreadPool时清除ThreadLocal值
在重用线程池中的线程时,我们从线程的最后一次执行中获取线程局部变量值 我知道线程本地是线程的一部分,所以当我们使用线程池时,它会被重用。但我的问题是,我不想在上一次执行中使用线程局部变量集,这对许多人来说都是有效的用例Java 返回ThreadPool时清除ThreadLocal值,java,multithreading,threadpool,Java,Multithreading,Threadpool,在重用线程池中的线程时,我们从线程的最后一次执行中获取线程局部变量值 我知道线程本地是线程的一部分,所以当我们使用线程池时,它会被重用。但我的问题是,我不想在上一次执行中使用线程局部变量集,这对许多人来说都是有效的用例 当线程在当前执行后进入池时,有没有更好的方法来清除线程本地值?您可以使用反射清除线程的线程本地映射。这将清除所有线程局部变量,无论它们位于何处 理想情况下,您应该编写代码,使线程局部变量不是这样有状态的。这意味着单元测试更加困难。您可以使用反射清除线程的线程本地映射。这将清除所有
当线程在当前执行后进入池时,有没有更好的方法来清除线程本地值?您可以使用反射清除线程的线程本地映射。这将清除所有线程局部变量,无论它们位于何处
理想情况下,您应该编写代码,使线程局部变量不是这样有状态的。这意味着单元测试更加困难。您可以使用反射清除线程的线程本地映射。这将清除所有线程局部变量,无论它们位于何处
理想情况下,您应该编写代码,使线程局部变量不是这样有状态的。这意味着单元测试更加困难。清除ThreadLocal应该是线程用户的责任,也就是说,放置ThreadLocal的代码也应该清除它。使用例如try finally块来确保发生这种情况
然而,你可以黑客你想要的!说真的,这并不难-您只需反省进入线程对象/类的方式,找到ThreadLocals所在的映射,然后清除它。清除ThreadLocal应该是线程用户的责任-也就是说,放置ThreadLocal的代码也应该清除它。使用例如try finally块来确保发生这种情况
然而,你可以黑客你想要的!说真的,这并不困难-您只需反省进入线程对象/类的方式,找到ThreadLocals所在的映射,然后清除它。使用公共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;
...
无法使用公共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;
...
您可以向我们展示您的代码吗?为什么不在从线程池请求线程实例时简单地重置线程池变量呢?不清除ThreadLocal值是Java中内存泄漏的典型示例之一。我建议您将您的操作包装在某种拦截器模式中,并在完成后清除该值。您使用的是ExecutorService吗?能否向我们展示您的代码?为什么不在从池中请求线程实例时简单地重置线程池变量?不清除ThreadLocal值是Java中内存泄漏的经典示例之一。我建议您将您的操作包装在某种拦截器模式中,并在完成后清除该值。您正在使用ExecutorService吗?