Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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缓存线程池和线程本地_Java_Multithreading_Concurrency_Threadpool_Thread Local - Fatal编程技术网

Java缓存线程池和线程本地

Java缓存线程池和线程本地,java,multithreading,concurrency,threadpool,thread-local,Java,Multithreading,Concurrency,Threadpool,Thread Local,我有一个关于java和并发性的问题 假设我有一个名为“a”的线程局部变量。我使用CachedThreadPool来获取新线程。 重用线程时,ThreadLocal变量“a”会发生什么变化?它保持相同的值(因为它是同一个线程)或开始时为空(就像线程是新的一样)?如果线程返回到池中,ThreadLocal变量仍将附加到它。将ThreadLocals与池一起使用时,必须小心设置线程何时从池中提取并在返回之前取消设置。默认情况下,ThreadLocals与线程一起重用。如果需要重新初始化它们,可以通过重

我有一个关于java和并发性的问题

假设我有一个名为“a”的线程局部变量。我使用CachedThreadPool来获取新线程。
重用线程时,ThreadLocal变量“a”会发生什么变化?它保持相同的值(因为它是同一个线程)或开始时为空(就像线程是新的一样)?

如果线程返回到池中,ThreadLocal变量仍将附加到它。将ThreadLocals与池一起使用时,必须小心设置线程何时从池中提取并在返回之前取消设置。

默认情况下,ThreadLocals与线程一起重用。如果需要重新初始化它们,可以通过重写以下方法来实现:

挂钩方法 此类提供了受保护的可重写beforeExecute(java.lang.Thread,java.lang.Runnable)和afterExecute(java.lang.Runnable,java.lang.Throwable)方法,这些方法在执行每个任务之前和之后调用。这些可用于操纵执行环境;例如,重新初始化ThreadLocals、收集统计信息或添加日志项。此外,可以重写method terminated()以执行执行器完全终止后需要执行的任何特殊处理。 如果钩子或回调方法抛出异常,内部工作线程可能会失败并突然终止


可以使用反射清除线程的线程本地池。你能行

public static void clearAllThreadLocals() {
    try {
        Field threadLocals = Thread.class.getDeclaredField("threadLocals");
        threadLocals.setAccessible(true);
        threadLocals.set(Thread.currentThread(), null);
    } catch (Exception e) {
        throw new AssertionError(e);
    }
}

我在这里看到的一个可解决的问题是ThreadPoolExecutor需要知道线程局部变量。有点不好的分离。可以通过一个可观察对象来解决,该对象在线程完成执行后抛出一个事件。一旦触发afterExecute事件,特定的本地线程可以注册(观察者)进行清理。