线程池与Threadlocal
线程池与Threadlocal
线程池: 线程池是为了使线程能够得到循环的利用,线程池里面养着一些线程,有任务需要使用线程的时候就往线程池里抓线程对象出来使用。线程池里的线程能够重复使用,所以在资源上能够得到比较好的利用。 在任务数量多的时候就适合使用线程池,因为总不可能将线程无限的开启下去,万一任务数量有几千的话就得开几千个线程,这样对于资源上就比较浪费了。如果使用线程池的话,就能重复的利用线池里的线程,就不需要一直新开启线程,所有的线程就能得到很好的循环利用。
线程池的开启方式:
线程池通过Executors类来开启,线程池有几种类型,有固定线程数量的,有不固定数量的,有具备定时功能的,还有单线程的。
1.创建固定线程数量的线程池:

运行结果:

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

运行结果:

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

运行结果:

4.创建单线程池:

运行结果:

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

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

运行结果:

从代码的运行结果可以看出,数据有被覆盖的现象。这时候可能会有人说,每次都构建Test1的对象来进行调用就可以避免出现这种问题了。是的,的确每次构建一个对象就能避免这种问题的出现,但是万一是静态的情况呢,不是说在开发的过程中都只会出现一种情况,所以如果是这种静态的情况,使用这个办法就没办法解决了,甚至还会出现问题。
虽然上面这种办法用在实例的情况下还行,不过还有另一种方法,就是使用Hashtable集合就能解决这个问题,Hashtable集合是键值对集合,一个键对应着一个值。因为这种特性,我们可以将线程的名称作为键值,然后对应存储这个线程所带的值,接着存放在Hashtable集合里。这样,在方法中取值的时候就能取到与线程相对应的值了,所以其他线程的值就不会被覆盖了,使用这个方法就能解决静态的情况了。
正题到了,使用Hashtable集合还是稍微有点麻烦,所以还有一种更方便的解决方式就是使用Threadlocal类,使用Threadlocal类的set将值设置进去,再使用get方法得到值就可以了,都不需要设置键值,比起Hashtable要方便一些。
代码示例:

运行结果:

线程池与Threadlocal的更多相关文章
- 阿里开源支持缓存线程池的ThreadLocal Transmittable ThreadLocal(TTL)
功能 在使用线程池等会缓存线程的组件情况下,提供ThreadLocal值的传递功能. JDK的InheritableThreadLocal类可以完成父子线程值的传递. 但对于使用线程池等会缓存线程的组 ...
- 线程池-Threadlocal
ThreadLoclc初衷是线程并发时,解决变量共享问题,但是由于过度设计,比如弱引用的和哈希碰撞,导致理解难度大.使用成本高,反而成为故障高发点,容易出现内存泄露,脏数据.贡献对象更新等问题.单从T ...
- 详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失
在Spring Cloud中我们用Hystrix来实现断路器,Zuul中默认是用信号量(Hystrix默认是线程)来进行隔离的,我们可以通过配置使用线程方式隔离. 在使用线程隔离的时候,有个问题是必须 ...
- 通过transmittable-thread-local源码理解线程池线程本地变量传递的原理
前提 最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文.想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能 ...
- 0041 Java学习笔记-多线程-线程池、ForkJoinPool、ThreadLocal
什么是线程池 创建线程,因为涉及到跟操作系统交互,比较耗费资源.如果要创建大量的线程,而每个线程的生存期又很短,这时候就应该使用线程池了,就像数据库的连接池一样,预先开启一定数量的线程,有任务了就将任 ...
- ThreadLocal 遇上线程池的问题及解决办法
ThreadLocal 称为线程本地存储,它为每一个使用它的线程提供一个其值(value)的副本.可以将 ThreadLocal<T> 理解成 Map<Thread, T>,即 ...
- ThreadLocal与线程池使用的问题
感谢博主的这篇分享,见 https://www.cnblogs.com/qifenghao/p/8977378.html 在今天的面试中,突然被考官问了这个问题,当时脱口而出的是 threadloca ...
- ThreadLocal 定义,以及是否可能引起的内存泄露(threadlocalMap的Key是弱引用,用线程池有可能泄露)
ThreadLocal 也可以跟踪一个请求,从接收请求,处理请求,到返回请求,只要线程不销毁,就可以在线程的任何地方,调用这个参数,这是百度二面的题目,参考: Threadlocal 传递参数(百度二 ...
- 线程池 Threadlocal 使用注意
线程池中的线程是重复使用的,即一次使用完后,会被重新放回线程池,可被重新分配使用. 因此,ThreadLocal线程变量,如果保存的信息只是针对一次请求的,放回线程池之前需要清空这些Threadloc ...
随机推荐
- Xmpp学习之Android-smack入门指导
Xmpp学习之Android-smack入门指导 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/69404 ...
- kotlin成长之路
前言: 从接触Kotlin开始,也就是我今天开启写技术博客的决定,文采不佳,欢迎各位阅读者的理解与指点.而该篇文章是最为博客新手的我对Kotlin成长的引导篇,所以内容一般是Kotlin技术博客的目录 ...
- servlet与jsp
Servlet生命周期 一.初始化阶段 当WEB客户第一次请求访问某个Servlet的时候,WEB容器将创建这个Servlet的实例.调用init()方法进行Servlet的初始化 一.响应客户请 ...
- java 多线程基础
线程是进程内的执行单元,进程当中都有若干个线程. 通常主线程或进程是阻塞式的按顺序执行的,如果希望异步执行些子任务,而不要阻塞当前线程的执行,即需要创建子线程,子线程创建后主线程可以等待它们的结果,得 ...
- Vue2.0 从零开始--搭建环境
简要:继项目空闲后,开始着手vue的学习;为此向大家分享其中的艰辛和搭建办法,希望能够跟各位VUE大神学习探索,如果有不对或者好的建议告知下:*~*! 一.什么是VUE? 是一种node.js框架,特 ...
- 从《海贼王》的视角走进BAT的世界(百度/阿里/腾讯)
在伟大航路后半段--新世界,有三位君临天下的海上枭雄,就犹如海上皇帝一般,被人们称为"三皇",他们是--洛宾·里(Robin·Li),杰克·马(Jack·Ma)和波尼(pony)! ...
- Python 任务队列 Celery
一. celery 简介 Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时提供操作和维护分布式系统所需的工具.. 所谓任务就是消息, 消息中的有效载荷中包含要执行任务需要的全部数据 ...
- 安装nginx+lua开发环境
一.安装nginx及搭建本地测试环境 1.创建安装目录: /data/nginx2.安装make: yum-y install gcc automake autoconf libt ...
- [USACO08JAN]手机网络Cell Phone Network
[USACO08JAN]手机网络Cell Phone Network 题目描述 Farmer John has decided to give each of his cows a cell phon ...
- ASP.NET Core 源码学习之 Options[1]:Configure
配置的本质就是字符串的键值对,但是对于面向对象语言来说,能使用强类型的配置是何等的爽哉! 目录 ASP.NET Core 配置系统 强类型的 Options Configure 方法 源码解析 ASP ...