栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将ThreadLocal传播到从ExecutorService提取的新线程

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将ThreadLocal传播到从ExecutorService提取的新线程

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/437662.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号