ThreadLocal
2015-10-23 20:55
302 查看
1.ThreadLocal
JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量。
2.ThreadLocal 涉及方法
3.源码介绍
ThreadLocal相当于map{this.currentThread,var},类似通过当前线程的key,来取的自己的变量,这样每个变量都有自己的一份共享变量,彼此之间不会干扰,下面是他的set(T
value)源码介绍:
publicvoid set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
第一次会判断map有没有值,如果没有才进行创建,所以彼此之间不会产生影响
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
首先如果map不等于null,就返回当前线程的值,如果等于null 这里就返回初始化值
4. 下面自己写的例子
private Integer ticketNum=5;
private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>() {
public Integer initialValue() {
return 0;
}
};
public Integer getNextNum()
{
seqNum.set(seqNum.get()+1);
return seqNum.get();
}
@Override
publicvoid run() {
for(int i=0;i<6;i++)
{
if(ticketNum>0)
{
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Integer tmpNum=this.ticketNum--;
System.out.println(Thread.currentThread().getName()+"号线程的值---〉"+getNextNum());
}
}
}
public staticvoid main(String[] args) {
SecondRunnable my = new SecondRunnable();
new Thread(my, "1").start();
new Thread(my, "2").start();
new Thread(my, "3").start();
}
运行结果如下:
1号线程的值---〉1
2号线程的值---〉1
3号线程的值---〉1
3号线程的值---〉2
1号线程的值---〉2
2号线程的值---〉2
3号线程的值---〉3
2号线程的值---〉3
1号线程的值---〉3
3号线程的值---〉4
2号线程的值---〉4
1号线程的值---〉4
1号线程的值---〉5
2号线程的值---〉5
3号线程的值---〉5
2号线程的值---〉6
1号线程的值---〉6
3号线程的值---〉6
简单小节结束
JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量。
2.ThreadLocal 涉及方法
T | get() 返回当前线程的值 |
protected T | initialValue() 初始化当前线程的值,如果第一次没有set之间get这个时候拿出的就是在这里初始化的值 |
void | remove() 删除当前线程的值 |
void | set(T value) 为当前线程福祉 |
ThreadLocal相当于map{this.currentThread,var},类似通过当前线程的key,来取的自己的变量,这样每个变量都有自己的一份共享变量,彼此之间不会干扰,下面是他的set(T
value)源码介绍:
publicvoid set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
第一次会判断map有没有值,如果没有才进行创建,所以彼此之间不会产生影响
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
首先如果map不等于null,就返回当前线程的值,如果等于null 这里就返回初始化值
4. 下面自己写的例子
private Integer ticketNum=5;
private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>() {
public Integer initialValue() {
return 0;
}
};
public Integer getNextNum()
{
seqNum.set(seqNum.get()+1);
return seqNum.get();
}
@Override
publicvoid run() {
for(int i=0;i<6;i++)
{
if(ticketNum>0)
{
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Integer tmpNum=this.ticketNum--;
System.out.println(Thread.currentThread().getName()+"号线程的值---〉"+getNextNum());
}
}
}
public staticvoid main(String[] args) {
SecondRunnable my = new SecondRunnable();
new Thread(my, "1").start();
new Thread(my, "2").start();
new Thread(my, "3").start();
}
运行结果如下:
1号线程的值---〉1
2号线程的值---〉1
3号线程的值---〉1
3号线程的值---〉2
1号线程的值---〉2
2号线程的值---〉2
3号线程的值---〉3
2号线程的值---〉3
1号线程的值---〉3
3号线程的值---〉4
2号线程的值---〉4
1号线程的值---〉4
1号线程的值---〉5
2号线程的值---〉5
3号线程的值---〉5
2号线程的值---〉6
1号线程的值---〉6
3号线程的值---〉6
简单小节结束
相关文章推荐
- 快乐、平衡、高效,敏捷个人2015版卡片
- 实时数据库:优势和报价
- 【问题】做图片验证码时乱码了,在header前加上ob_clean()就能神奇的显示?!
- 数值分析:Hermite多项式
- 黑马程序员-------- Java抽象和接口的学习和笔记
- Jsp验证码
- 数值分析:Hermite多项式
- 谈谈runloop
- NSOperation之为UItabView制作图片缓存——在didReceiveMemoryWarning方法中做图片缓存的清理操作
- 常见错误总结
- 黑马程序员——Java中的IO流(下)
- <meta http-equiv="X-UA-Compatible" content="IE=Edge">
- 【Python爬虫实战--3】html写正则表达式
- 如何通过java代码在数据库上增删改查?
- 利用Qrcode.jar生成二维码
- YTU2506——切面条(蓝桥杯赛题)
- 写手Remoting测试工具
- java作业4
- Oracle安装后出现的问题
- Spring动态代理,aop 注解实现aop