package ThreadDemo.it_1;
//线程范围内的数据共享问题
//数据放在对象中,每条线程身上都有自己的数据.互不干涉的操作
public class ThreadScopeShareData5 {
static ThreadLocal<person> tl = new ThreadLocal<person>();
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
person p = new person("张飞", 40);
tl.set(p);
new Name().printName();
new Age().printAge();
}
}, "线程1").start();
//
new Thread(new Runnable() {
@Override
public void run() {
person p = new person("关羽", 45);
tl.set(p);
new Name().printName();
new Age().printAge();
}
}, "线程2").start();
}
}
// 获取姓名的模块
static class Name {
String name;
public void printName() {
System.out.println("线程是:" + Thread.currentThread().getName()
+ ";对象姓名:" + tl.get().getName());
}
}
// 获取年龄的模块
static class Age {
int age;
public void printAge() {
System.out.println("线程是:" + Thread.currentThread().getName()
+ ";对象年龄:" + tl.get().getAge());
}
}
//数据类,
static class person {
String name;
int age;
person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
}
第二种相对较专业点的做法:
单例设计模式和ThreadLocal类的结合
import java.util.Random;
//线程范围内的数据共享问题
//数据放在对象中,每条线程身上都有自己的数据.互不干涉的操作
//线程启动,得到数据对象后再访问其他模块,数据都仅仅是自己身上这份数据,每个线程都有自己的的据
//用懒汉式设计模式
public class ThreadScopeShareData6 {
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
person p = person.getPerson();
new Name().printName();
new Age().printAge();
}
}).start();
//
new Thread(new Runnable() {
@Override
public void run() {
person p = person.getPerson();
new Name().printName();
new Age().printAge();
}
}).start();
}
}
// 获取姓名的模块
static class Name {
String name;
public void printName() {
System.out.println("线程是:" + Thread.currentThread().getName()
+ ";对象姓名:" + person.getPerson().getName());
}
}
// 获取年龄的模块
static class Age {
int age;
public void printAge() {
System.out.println("线程是:" + Thread.currentThread().getName()
+ ";对象年龄:" + person.getPerson().getAge());
}
}
//数据类,
static class person {
private String name;
private int age;
private person() {
}
private static ThreadLocal<person> tl_person =
new ThreadLocal<person>();
private static person p = null;
public static person getPerson() {
p = tl_person.get();
if (p == null) {
p = new person();
p.name = Thread.currentThread().getName();
p.age = new Random().nextInt(100);
tl_person.set(p);
}
return p;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
}