Mat*_*teu 7 java concurrency multithreading thread-local threadpool
我有一个关于java和并发的问题.
假设我有一个名为a的ThreadLocal变量.我使用CachedThreadPool来获取新线程.当一个线程被重新调用时,ThreadLocal变量会发生什么?它保持相同的值(因为它是一个相同的线程)或它开始为空(好像线程是新的)?
谢谢
小智 10
默认情况下,ThreadLocals与线程一起重用.如果您需要重新初始化它们,可以通过覆盖下面提到的方法来实现:
来自javadoc的java.util.concurrent.ThreadPoolExecutor
Hook方法 此类提供在每个任务执行之前和之后调用的受保护的可覆盖的beforeExecute(java.lang.Thread,java.lang.Runnable)和afterExecute(java.lang.Runnable,java.lang.Throwable)方法.这些可以用来操纵执行环境; 例如,重新初始化ThreadLocals,收集统计信息或添加日志条目.此外,可以重写方法terminate()以执行Executor完全终止后需要执行的任何特殊处理.如果钩子或回调方法抛出异常,内部工作线程可能会失败并突然终止.
您可以使用反射清除线程的线程本地池。你可以做
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);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7840 次 |
最近记录: |