文档章节

线程池与Threadlocal

凯哥学堂
 凯哥学堂
发布于 2017/07/10 23:23
字数 883
阅读 30
收藏 2

线程池与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

© 著作权归作者所有

共有 人打赏支持
凯哥学堂
粉丝 17
博文 313
码字总数 278634
作品 0
东城
程序员
Java虚拟机运行时数据区结构

本文部分参考自《Java虚拟机规范(Java SE 7版)》的中译本和周志明的《深入理解Java虚拟机》,另加个人理解。原书对Java虚拟机运行时数据区描述只有6页,同时参考其他网络网资料,个人能力所...

foodon
2014/12/09
0
4
Java并发编程笔记之ThreadLocal内存泄漏探究

使用 ThreadLocal 不当可能会导致内存泄露,是什么原因导致的内存泄漏呢? 我们首先看一个例子,代码如下: / Created by cong on 2018/7/14. */public class ThreadLocalOutOfMemoryTest { ...

狂小白
07/14
0
0
Java并发编程之ThreadLocal内存泄漏探究

使用 ThreadLocal 不当可能会导致内存泄露,是什么原因导致的内存泄漏呢? 我们首先看一个例子,代码如下: / Created by cong on 2018/7/14. */public class ThreadLocalOutOfMemoryTest { ...

狂小白
07/14
0
0
JVM 运行时数据区简介及堆与栈的区别

理解JVM运行时的数据区是Java编程中的进阶部分。我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机制,...

大数据之路
2015/08/02
0
1
ThreadLocal可能引起的内存泄露

  threadlocal里面使用了一个存在弱引用的map,当释放掉threadlocal的强引用以后,map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露. 最好的做法是将调用thr...

天天顺利
06/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

React 服务器渲染原理解析与实践

网盘下载地址 React 服务器渲染原理解析与实践 本套课程,讲解了React中SSR技术的整个搭建思路及流程,完整的从原理上讲清楚了SSR的概念,重点在于讲解编写SSR框架遇到的各种知识点,以及细节...

qq__2304636824
40分钟前
0
0
Jenkins使用

clean install -Dmaven.test.skip=true

1713716445
49分钟前
0
0
多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
今天
1
0
HBase 表修复在线方式和离线方式

一、在线修复 1.1 使用检查命令 $ ./bin/hbase hbck 该命令可完整修复 HBase 元数据信息;存在有错误信息会进行输出; 也可以通过如下命令查看详细信息: $ ./bin/hbase hbck -details 1.2 ...

Ryan-瑞恩
今天
3
0
redis 系列二 -- 常用命令

1.基础命令 info ping quit save dbsize select flushdb flushall 2.键命令 2.1 set 直接赋值 set a a 2.2 get 取值 get a 2.3 exists 是否存在 exists a 2.4 expire 设置剩余时间 秒 expire......

imbiao
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部