Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回ThreadPool时清除ThreadLocal值_Java_Multithreading_Threadpool - Fatal编程技术网

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吗?