ThreadLocal与线程关联的实例集保存在每个实例的私有成员中
Thread。列举这些的唯一机会就是对问题进行一些思考
Thread;这样,您可以覆盖线程字段上的访问限制。
一旦获得的集合
ThreadLocal,就可以使用
beforeExecute()和的
afterExecute()钩子在后台线程中进行复制
ThreadPoolExecutor,或者通过
Runnable为任务创建一个包装器来拦截
run()调用以设置一个未设置的必要
ThreadLocal实例。实际上,后一种技术可能会更好,因为它会为您提供一个方便的位置,以便
ThreadLocal在排队任务时存储值。
更新: 这是第二种方法的更具体的说明。与我的原始描述相反,包装器中存储的全部是调用线程,在执行任务时会对其进行查询。
static Runnable wrap(Runnable task){ Thread caller = Thread.currentThread(); return () -> { Iterable<ThreadLocal<?>> vars = copy(caller); try { task.run(); } finally { for (ThreadLocal<?> var : vars) var.remove(); } };}private static Collection<ThreadLocal<?>> copy(Thread caller){ throw new UnsupportedOperationException();}


