线程池与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 ...
随机推荐
- php 二级级联菜单
找了很多个级联的菜单,都不好用,自己弄个简单点的,共享下,希望有朋友用得着 <?php //建立表country,有三个字段Id,parentId,area. $pro = $_POST['pr ...
- DllImport 自动选择x64或x86 dll
前言 标题不知道怎么确切地命名,在.net的托管世界里,有时不得不使用c的某个动态库,比如ocr.opencv等,如果幸运,有前人已经包装出.net版本,但有些不非常流行的库,只能自己使用pinvok ...
- ssh别名登录密钥登录
在centos上使用别名和是用密钥登录: vim /root/.ssh/config #输入下列内容 Host * User root #以root登录 ServerAliveInterval ...
- PHP编译
编译php-5.3.6的时候需要先打一个内存泄露的补丁,具体的操作如下 tar vzxf suhosin-0.9.32.1.tar.gz tar vjxf php-5.3.6.tar.bz2 cd p ...
- 计时器60s
计时器是经常用到的功能,下面以react nativ的例子简介来写一个倒计时60s的小demo. 代码如下: import React, { Component } from 'react'; imp ...
- PHP 上传文件大小限制
配置php.ini文件 (以上传500M以下大小的文件为例) 查找以下选项并修改-> file_uploads = On ;打开文件上传选项 upload_max_filesize = 500M ...
- 各开放平台API接口通用SDK序列文章 前言
最近两年一直在做API接口相关的工作,在平时工作中以及网上看到很多刚接触API接口调用的新人一开始会感到很不适应,要看的文档一大堆,自己要调用的接口找不着,或都找着了不知道怎么去调用,记得包括自己刚开 ...
- linux下swoole的安装
//官方推荐的安装方式1:下载压缩包 wget https://github.com/swoole/swoole-src/archive/swoole-1.8.4-stable.zip 2:解压缩 u ...
- 在win7下如何设置计划任务每一分钟执行一次
- iis部署wcf服务过程
一.在iis网站中添加wcf服务,一直添加到web.config目录即可 二.点击基本设置-->连接为-->特定用户.填写登入电脑的用户名和密码. 三.点击身份验证 四.控制面板,设置防火 ...