郑州做网站大量网站被关,wordpress 无标题,做导航网站不侵权吗,好的h5制作网站模板1、原理
TransmittableThreadLocal#xff08;简称TTL#xff09;是阿里巴巴开源的一个Java库#xff0c;用于解决线程池中线程本地变量传递的问题。其底层原理主要是基于Java的ThreadLocal机制并对其进行扩展#xff0c;以支持在父子线程间以及线程池中任务切换时#x…1、原理
TransmittableThreadLocal简称TTL是阿里巴巴开源的一个Java库用于解决线程池中线程本地变量传递的问题。其底层原理主要是基于Java的ThreadLocal机制并对其进行扩展以支持在父子线程间以及线程池中任务切换时能够传递和继承ThreadLocal变量的值。下面是TTL的核心工作原理 基于ThreadLocal的扩展 TTL继承自InheritableThreadLocal和ThreadLocal但与InheritableThreadLocal不同的是TTL解决了在已经存在的线程如线程池中的线程之间传递ThreadLocal值的问题。 线程池任务切换处理 在任务提交到线程池之前会先将当前父线程的ThreadLocal变量值保存到一个中间结构中通常是通过装饰器模式比如TtlRunnable或TtlCallable。当任务开始在子线程线程池中的线程中执行时会从这个中间结构中恢复这些变量值并设置到子线程的ThreadLocal副本中从而实现了值的跨线程传递。 异步任务传递 对于异步任务TTL确保了即使在异步执行的上下文中父线程的ThreadLocal状态也能被正确地传递给处理该任务的子线程。 核心组件与流程 构建TtlRunnable/CallableTTL提供工具方法如TtlRunnable.get()来包装原有的Runnable或Callable对象使其在执行前能加载父线程的ThreadLocal状态。上下文传递与清理TTL管理一个上下文其中包含要传递的ThreadLocal变量值确保在任务执行前后这些值的传递和清理操作得以正确执行避免内存泄漏。 源码层面 TTL内部实现涉及对ThreadLocal的深入理解和扩展包括如何安全地存储和恢复变量值以及如何与线程池的任务调度机制相结合。它通过覆盖InheritableThreadLocal的一些方法并添加额外的逻辑来实现这一功能。
综上所述TransmittableThreadLocal通过精心设计的机制在不改变原有线程池和任务执行模型的基础上增强了ThreadLocal的传递能力使之适应更复杂的多线程和线程池应用场景。
2、过程分析 上图其实把过程介绍的很清晰和详细了。我们可以简单的认为TransmittableThreadLocal和普通TheadLocal是一样的都是线程变量只不过从语义上TransmittableThreadLocal是用来在线程间传递值的。这个传递是TtlRunnable来完成的它的本质是个wapper它在执行线程前获取父线程的所有值上图4.1线程执行时会将这些值重放/赋值到子线程的里上图6.2当然TtlRunnable使用了工具类Transmitter。
因此TransmittableThreadLocal变量值要想实现线程间的传递线程必须用TtlRunnable修饰或者把线程提交给TtlExecutors修饰过的线程池执行否则TransmittableThreadLocal与ThreadLocal没有区别。TtlExecutors的原理也很简单它把提交给它的Runnable包装成TtlRunnable我们看到TtlRunnable构造方法就是需要一个Runnable当然如果提交给它的已经是TtlRunnable它不会再次包装。
总结TransmittableThreadLocalTtlRunnableTtlExecutors 是在Java提供的既有能力上进行包装、拓展实现了新的功能它使用了装饰器模式。