Java Cached线程池和线程本地

时间:2011-09-13 14:46:49

标签: java multithreading concurrency threadpool thread-local

我对java和并发有疑问。

假设我有一个名为a的ThreadLocal变量。我使用CachedThreadPool来获取新线程。 当一个线程被重新调用时,ThreadLocal变量会发生什么?它保持相同的值(因为它是一个相同的线程)或者它开始为空(好像线程是新的)?

由于

3 个答案:

答案 0 :(得分:10)

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

from javadoc for java.util.concurrent.ThreadPoolExecutor

  

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

答案 1 :(得分:4)

您可以使用反射清除线程的线程本地池。你可以做到

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);
    }
}

答案 2 :(得分:3)

如果线程返回到池中,则ThreadLocal变量仍将附加到它。将ThreadLocals与池一起使用时,必须注意能够设置何时从池中拉出线程并在返回之前取消设置。