验证中...
开源中国 2018 年度最后一场技术盛会邀你来约~错过就要等明年啦!点此立即预约
语言: Java
分类: 编程语言基础
最后更新于 2018-12-09 10:09
ToreadLocal类
原始数据 复制代码
ThreadLocal并不是一个线程,而是保存线程本地化的容器。当运行于多线程环境的某个对象使用ThreadLocal维护变量时,ThreadLocal
为每个使用该变量的线程分配一个独立的变量副本。所以每个线程都可以独立地改变自己的副本,而不会影响到其他线程所对应的副本。
ThreadLocal是如何做到为每个线程维护一份独立的变量副本呢?
实现思路:在ThreadLocal类中有一个Map,用于存储每个线程的变量副本,Map中元素的键为线程对象,值为对应线程的变量副本。
Threadlocal类可以在保存内容之外,还可以多存放一个线程的标记。在ThreadlLocal类中提供有如下的方法:
· 构造方法:public ThreadLocal();
· 设置数据:public void set(T value);
· 取出数据:public T get();
· 删除数据:public void remove();
public class ThreadLocalDemo {
public static void main(String[] args) {
Runnable run1 = ()->{
Message message = new Message();
message.setInfo("第一个线程的消息");
Channel.setMessage(message);
Channel.send();
};
Runnable run2 = ()->{
Message message = new Message();
message.setInfo("第二个线程的消息");
Channel.setMessage(message);
Channel.send();
};
Runnable run3 = ()->{
Message message = new Message();
message.setInfo("第三个线程的消息");
Channel.setMessage(message);
Channel.send();
};
new Thread(run1,"发送者A").start();
new Thread(run2, "发送者B").start();
new Thread(run3, "发送者C").start();
}
}
class Channel{
private final static ThreadLocal<Message> THREADLOCAL = new ThreadLocal<Message>();
private Channel() {};
public static void setMessage(Message msg) {
THREADLOCAL.set(msg);
}
public static void send() {
System.out.println(Thread.currentThread().getName() + "[发送消息]" + THREADLOCAL.get().getInfo());
}
}
class Message{
private String info;
public void setInfo(String info) {
this.info = info;
}
public String getInfo() {
return this.info;
}
}

评论列表( 0 )

你可以在登录后,发表评论

搜索帮助