博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程并行与ThreadLocal存储
阅读量:6695 次
发布时间:2019-06-25

本文共 1063 字,大约阅读时间需要 3 分钟。

怎么让子线程也能拥有主线程ThreadLocal的值呢,很多童鞋第一反应是重写线程池的线程初始化方法,在初始化的的时候将ThreadLocal中保存的数据copy一份到子线程。这种方法是行不通的。线程池中的线程运行策略是判断当前队列中是否有任务,如果没有任务,则会在设定的时间后销毁;如果有任务,则会继续领下一个任务继续执行,而一般拒绝策略是CallerRunsPolicy。

为了解决线程池中变量传递,可以使用TransmittableThreadLocal的类,继承于InheritableThreadLocal。它通过包装返回Runnable的方式代理了run方法,在run之前copy装载线程变量,run之后清除线程变量,来实现此功能。为此需要修改runable接口。

com.alibaba.ttl.TtlRunnable#run 这个才是真正执行的run方法

Object backup = replay(captured);        try {            runnable.run();        } finally {            restore(backup);        }

TransmittableThreadLocal除了继承过来的线程Map,它还定义了一个名叫holder的InheritableThreadLocal静态变量,也就是说TransmittableThreadLocal有两套线程变量。

使用方法:

com.alibaba
transmittable-thread-local
2.5.0

先调用TransmittableThreadLocal.set保存线程变量,除了正常保存外,还会保存到holder里。其实这么设置一下,当前线程的Map里就有两个Key-Value了,一个是TransmittableThreadLocal本身的,一个是holder的,并且holder真实的Value是一个WeakHashMap(也是弱引用),而且这个WeakHashMap会把TransmittableThreadLocal引用本身当做Key保存起来。外面传过进来的变量设置到当前执行任务的线程上去。run之后调用restoreBackup清除当前线程上被copied设置的变量并还原backup。

转载地址:http://rytoo.baihongyu.com/

你可能感兴趣的文章
DevOps团队结构类型汇总:总有一款适合你
查看>>
理解浏览器是如何加载及渲染网页的
查看>>
Vue2.0王者荣耀助手
查看>>
Micronaut教程:如何使用基于JVM的框架构建微服务
查看>>
一个“Internal”牵扯出的代码泄露,阿里云独家回应
查看>>
微软超过苹果 成为全球第一大市值公司
查看>>
比特币寒冬中,你更应该关注企业区块链!
查看>>
\"Grokking Algorithms\"简介与作者采访
查看>>
停止过度设计,开发客户需要的软件
查看>>
用WinForm/WPF代码来为.NET Core 3.0功能投票
查看>>
边缘控制平面Ambassador全解读
查看>>
F#创建者Don Syme谈F#设计原则
查看>>
微软正在考虑将Windows默认浏览器改为Chromium
查看>>
从蚂蚁金服实践入手,带你深入了解 Service Mesh
查看>>
京东购物在微信等场景下的算法应用实践
查看>>
MongoDB Mobile Sync for iOS推出Beta版本
查看>>
VS Code 0.5添加ES6支持和Git工具改进
查看>>
F# 4.0于全平台发布
查看>>
回顾小程序2018年三足鼎立历程,2019年BAT火力全开
查看>>
Facebook开源ptr:在Python环境中并行运行单元测试
查看>>