`
l4432848
  • 浏览: 255312 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

线程池与Threadlocal

    博客分类:
  • java
阅读更多

线程池与Threadlocal

线程池: 线程池是为了使线程能够得到循环的利用,线程池里面养着一些线程,有任务需要使用线程的时候就往线程池里抓线程对象出来使用。线程池里的线程能够重复使用,所以在资源上能够得到比较好的利用。 在任务数量多的时候就适合使用线程池,因为总不可能将线程无限的开启下去,万一任务数量有几千的话就得开几千个线程,这样对于资源上就比较浪费了。如果使用线程池的话,就能重复的利用线池里的线程,就不需要一直新开启线程,所有的线程就能得到很好的循环利用。

线程池的开启方式:

线程池通过Executors类来开启,线程池有几种类型,有固定线程数量的,有不固定数量的,有具备定时功能的,还有单线程的。

1.创建固定线程数量的线程池:

image

运行结果:

image

2.创建不固定线程数量的线程池:

image

运行结果:

image

3.创建具备定时功能的线程池:

image

运行结果:

image

4.创建单线程池:

image

运行结果:

image

Threadlocal类:

说Threadlocal类之前,先看看一个问题。如果有A、B、C、D、E这几个方法,这几个方法除了A方法外都不具备参数,但是想要从A方法将一个值传递到E方法上去怎么办?仔细想一想似乎使用一个静态属性作为一个中间介质就可以实现到传递的效果。

示意图:

image

虽然咋看之下好像没什么问题,但是问题在于如果是多个线程同时去调用的话,就会出现值被覆盖的问题了,数据上就会出现混乱了。

代码示例: image image

运行结果:

image

从代码的运行结果可以看出,数据有被覆盖的现象。这时候可能会有人说,每次都构建Test1的对象来进行调用就可以避免出现这种问题了。是的,的确每次构建一个对象就能避免这种问题的出现,但是万一是静态的情况呢,不是说在开发的过程中都只会出现一种情况,所以如果是这种静态的情况,使用这个办法就没办法解决了,甚至还会出现问题。

虽然上面这种办法用在实例的情况下还行,不过还有另一种方法,就是使用Hashtable集合就能解决这个问题,Hashtable集合是键值对集合,一个键对应着一个值。因为这种特性,我们可以将线程的名称作为键值,然后对应存储这个线程所带的值,接着存放在Hashtable集合里。这样,在方法中取值的时候就能取到与线程相对应的值了,所以其他线程的值就不会被覆盖了,使用这个方法就能解决静态的情况了。

正题到了,使用Hashtable集合还是稍微有点麻烦,所以还有一种更方便的解决方式就是使用Threadlocal类,使用Threadlocal类的set将值设置进去,再使用get方法得到值就可以了,都不需要设置键值,比起Hashtable要方便一些。

代码示例:

image image

运行结果:

image

分享到:
评论

相关推荐

    ThreadLocal垮线程池传递数据解决方案.docx

    "ThreadLocal垮线程池传递数据解决方案" ThreadLocal 是Java语言中的一种机制,旨在提供线程内数据的传递解决方案。然而,在实际生产中,线程一般不可能孤立的独立去运行,而是交给线程池去调度处理。这时,...

    ThreadLocal_ThreadLocal源码分析_

    ThreadLocal的生命周期与线程相关。当线程结束时,ThreadLocalMap会随线程一起销毁,线程内的ThreadLocal变量也就不再有效。因此,ThreadLocal不适合用于存储跨线程或者线程池中的共享数据。 **使用ThreadLocal的...

    ThreadLocal 内存泄露的实例分析1

    关键在于,一旦 `MyCounter` 被设置到 `ThreadLocal`,那么它将与当前线程绑定,除非显式地移除,否则即使 `LeakingServlet` 执行结束,`MyCounter` 也不会被清理。 `WebappClassLoader` 的生命周期与 web 应用紧密...

    ThreadLocal的几种误区

    误区二:ThreadLocal与每个session相对应 在Java Web编程中,ThreadLocal与HTTP Session的概念混淆是常见的误解。虽然每个用户会话通常对应一个唯一的Session ID,但ThreadLocal并不直接与用户会话绑定。ThreadLocal...

    ThreadLocal

    3. **线程池中的ThreadLocal**: 在使用线程池时,线程可能会复用,之前的ThreadLocal值可能会影响后续的任务。因此,如果在使用线程池时依赖ThreadLocal,需要特别处理线程退出或清理ThreadLocal。 总的来说,...

    Java并发编程中ThreadLocal的原理与应用分析

    此外,文中还探讨了线程池中使用ThreadLocal可能出现的记忆泄漏风险及其解决措施。 适合人群:具备一定Java基础,特别是对并发编程有一定认识的研发人员或进阶程序员。 使用场景及目标:主要用于理解和解决在高并发...

    ThreadLocal原理及在多层架构中的应用

    - **难以调试**:由于ThreadLocal的隐式性,有时可能会导致难以发现的问题,特别是当线程池中的线程复用时。 ### 4. 使用注意事项 - 使用完毕后,应调用`remove()`方法清除ThreadLocal变量,防止内存泄漏。 - 尽量...

    ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案.docx

    2. 如果是线程池里的线程用 ThreadLocal 会有什么问题? ThreadLocal 的拓扑图: 虚线代表这弱引用,当前线程保存了 ThreadLocalMap 作为自己的 local 属性,而 Map 中的 key 又弱引用了 ThreadLocal,从而达到了...

    目前项目在用性能稳定的线程池源码

    1. 初始化:每个工作线程在启动时,可能会初始化一些线程局部变量,如ThreadLocal,以便在执行任务时保持独立的数据环境。 2. 执行任务:PooledThread会有一个run方法,该方法从工作队列中取出任务并执行。执行完毕...

    ThreadLocal原理及在多层架构中的应用.pdf

    首先,ThreadLocal原理是基于每个线程创建一个私有的数据存储结构(ThreadLocalMap),使得线程可以拥有自己独立的数据副本,而不会与其他线程共享。这意味着,即使多个线程访问相同的变量,它们也各自拥有这个变量...

    详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失

    但是,在Hystrix线程隔离模式下,ThreadLocal数据可能会丢失,因为Hystrix将请求放入Hystrix的线程池中去执行,这时候某个请求就有A线程变成B线程了,ThreadLocal必然消失了。 知识点3:线程切换导致ThreadLocal...

    ThreadLocal内存泄露分析

    2. **匿名内部类与ThreadLocal的结合**:在匿名内部类中使用ThreadLocal,由于内部类会隐式持有对外部类的引用,如果外部类对象很大,且线程持续存在,那么这个大的外部类对象也无法被垃圾收集,从而引发内存泄露。...

    2、导致JVM内存泄露的ThreadLocal详解

    1. **线程未正确销毁**:如果线程执行完毕后没有正确销毁或者线程池中线程长期存活,而`ThreadLocal`对象又未能及时清除,那么线程内的`ThreadLocalMap`将会持续占用内存,进而可能导致内存泄漏。 2. **...

    Java单线程ThreadLocal串值问题解决方案

    例如,在doGood方法中,我们使用了try-finally块来确保ThreadLocal变量currentUid的释放,从而避免了线程池中占用的资源。 Tomcat线程池机制 Tomcat服务器使用了线程池机制来管理线程池中的线程,以提高服务器的...

    并发编程库,&&,线程池

    在IT行业中,线程池是高并发编程领域中不可或缺的一部分,尤其在Java中,线程池的应用非常广泛。本文将详细解析线程池的概念、重要性以及如何在实际开发中合理利用。 首先,为什么要使用线程池?线程池的主要优势...

    day18 10.使用ThreadLocal来解决问题

    `get()`方法首先查找当前线程的ThreadLocalMap,然后返回与当前ThreadLocal实例关联的值。`set()`方法会在ThreadLocalMap中创建一个新的Entry,Entry是ThreadLocal和其值的一个键值对。`remove()`方法则从...

    8个案例详解教会你ThreadLocal.docx

    - 在面试中,可能会遇到关于 `ThreadLocal` 生命周期管理、内存泄漏、与 `synchronized` 的比较以及在实际应用中的场景分析等问题。 通过以上介绍,我们可以了解到 `ThreadLocal` 在处理多线程环境中提供了独特的...

    InheritableThreadLocal & ThreadLocal

    三、ThreadLocal与InheritableThreadLocal的区别 1. 变量继承性:ThreadLocal不支持变量继承,子线程无法访问父线程的ThreadLocal变量;而InheritableThreadLocal支持,子线程会自动复制父线程的副本。 2. 生命...

    Java面试 spring知识点 线程池 面试题

    本文将深入探讨Spring框架的核心原理、重要概念以及与线程池相关的知识。 首先,Spring框架的核心在于控制反转(IOC)和面向切面编程(AOP)。Spring的IOC容器是其核心组成部分,负责管理对象的创建和依赖关系。...

    Hystrix系列之信号量、线程池

    * 因为涉及到跨线程,那么就存在 ThreadLocal 数据的传递问题,比如在主线程初始化的 ThreadLocal 变量,在线程池线程中无法获取。 Hystrix 默认配置 Hystrix 默认使用了线程池模式,对于每个 Command,在初始化的...

Global site tag (gtag.js) - Google Analytics