如何将ThreadLocal传递到子线程
来源:互联网 发布:网络优化工程师的公司 编辑:程序博客网 时间:2024/05/16 07:01
在项目开发的过程中,我们常常会把一些常用的线程上下文信息放到ThreadLocal中(如Spring中的RequestContextHolder),方便在程序中随时调取。但是在使用多线程时父线程中的ThreadLocal通常无法直接传递到子线程中去,容易造成程序bug。
这种情况通常有两种方式将父线程中的ThreadLocal传递到子线程中。
方法一:
最常规的想法是在编写子线程任务时,每次都手动的将子线程需要用到的ThreadLocal数据传递到子线程中,这样子线程也能过随时获取到线程上下文信息。
方法二:
自定义一个ThreadPoolExecutor代替系统的ThreadPoolExecutor,每次用线程池提交线程任务时,线程池会自动将父线程的ThreadLocal自动传递到子线程中,避免每次手动传递ThreadLocal到子线程。
代码如下所示:
public class TraceThreadPoolExecutor extends ThreadPoolExecutor { public TraceThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); } public TraceThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory); } public TraceThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler); } public TraceThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); } /** * 覆盖execute方法,将一些上下文信息传递到子线程,如登陆用户信息等 */ @Override public void execute(final Runnable command) { final LoginUser loginUser = getLoginUser(); Runnable task = new Runnable() { @Override public void run() { SessionInfoContextHolder.setLoginInfo(loginUser); try{ command.run(); } catch (Exception e){ //dosomething } finally { clearLoginInfo(); } } }; super.execute(task); }}
0 0
- 如何将ThreadLocal传递到子线程
- handler底层是如何将消息从子线程发送到主线程
- 在子线程中如何使用Handler将一个包含对象的集合传递给主线程
- 将方法作为参数,传递到线程中
- 通过句柄将线程中的数据传递到Activity
- ThreadLocal父子线程传递实现方案
- spring使用ThreadLocal将资源和事务绑定到线程上
- 如何传递[Ctrl]+[Tab] 到 MDI子窗体
- Extjs 如何将CheckboxGroup中的实际值传递到后台
- rails如何将数据传递到js中?
- rails如何将数据传递到js中?
- 如何将子窗口提交到父窗口?
- Winform中如何实现父窗体传递数据到子窗体并刷新子窗体
- 关于ThreadLocal如何保证数据线程安全
- Spring如何处理线程并发 ThreadLocal
- angular2.0父子组件通信---如何通过组件属性将数据传递给子组件
- 在C#中主线程和子线程如何实现互相传递数据
- 在C#中主线程和子线程如何实现互相传递数据
- laravel phpexcel 导入导出
- 【BZOJ】4619 [Wf2016] Swap Space
- [BZOJ1968][Ahoi2005]COMMON 约数研究(线性筛)
- 内核键盘中断处理进阶
- WPF编程宝典学习笔记目录
- 如何将ThreadLocal传递到子线程
- 使用HttpURLConnection
- 基于珠海鼎芯imx6 ltib编译和配置
- openfiler 搭建虚拟存储 并 配置服务端
- C# try catch finally
- js去重
- http://blog.csdn.net/zhangweiwtmdbf/article/details/52369276
- ConvertLUnicodeStringToNullTerminatedString
- 抽象工厂模式