A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Sakuratossi 中级黑马   /  2014-9-6 11:53  /  748 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

ThreadLocal类
多个模块在同一个线程中运行时要共享同一份数据,实现线程范围内的数据共享可以Map集合,把key---线程名,value--线程数据,map的set方法传进去的值。
一个ThreadLocal对象只能记录一个线程内部的一个共享变量,需要记录多个共享数据,可以创建多个ThreadLocal对象,或者将这些数据进行封装,将封装后的数据对象存入ThreadLocal对象中。
将数据对象封装成单例,同时提供线程范围内的共享数据的设置和获取方法,提供已经封装好了的线程范围内的对象实例,使用时只需获取实例对象即可实现数据的线程范围内的共享,因为该对象已经是当前线程范围内的对象了。

public class ThreadLocalShareDataDemo
{
public static void main(String[] args)
{
for (int i=0; i<2; i++)  // 创建两个线程
{
new Thread(
new Runnable()
{
public void run()
{
int data = new Random().nextInt(889);
System.out.println(Thread.currentThread().getName()+"产生数据:"+data);
MyData myData = MyData.getInstance();
myData.setAge(data);
myData.setName("Name:"+data);
new A().get();
new B().get();
}
}).start();
}
}
static class A
{ //可以直接使用获取到的线程范围内的对象实例调用相应方法
String name = MyData.getInstance().getName();
int age = MyData.getInstance().getAge();
public void get()
{
System.out.println(Thread.currentThread().getName()+"-- AA name:"+name+"...age:"+age);
}
}
static class B
{
//可以直接使用获取到的线程范围内的对象实例调用相应方法
String name = MyData.getInstance().getName();
int age = MyData.getInstance().getAge();
public void get()
{
System.out.println(Thread.currentThread().getName()+"-- BB name:"+name+"...age:"+age);
}
}
static class MyData
{
private String name;
private int age;
private MyData() {};
//将实例对象存入当前线程范围内数据集中
static ThreadLocal threadLocal = new ThreadLocal();
public static MyData getInstance()
{
//从当前线程范围内数据集中获取实例对象
MyData instance = threadLocal.get();
if (instance==null)
{
instance = new MyData();
threadLocal.set(instance);
}
return instance;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马