ThreadLocal的练习代码

时间:2023-03-09 13:32:12
ThreadLocal的练习代码

场景:

有三个小孩儿,买了一个变形金刚玩具(Transformer)....

三个小孩都争着玩这个玩具....没有一个人可以玩...

第一种方式:每个人各玩一会....

第二种方式:再买两个玩具,一个人玩一个.

每个小孩都当成一个线程.三个小孩就有三个线程.

Child.java

 import java.util.Random;
import java.util.concurrent.TimeUnit; public class Child implements Runnable{
private Transformer2 transformer; private String name ; public Child(Transformer2 transformer) {
this.transformer = transformer;
} public Child() {
} public Transformer2 getTransformer() {
return transformer;
} public void setTransformer(Transformer2 transformer) {
this.transformer = transformer;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public void play(){ while (true) {
try {
//transformer = new Transformer();//每次调用该方法,该对象都是新的。 //想要的效果是每个小孩儿都有一个玩具,但是不管他玩多少次,这个玩具永远都是唯一的.
transformer = Transformer2.getInstance();
System.out.println(Thread.currentThread().getName() +" :"+transformer );
String str = "擎天柱" + new Random().nextInt(10);
System.out.println(Thread.currentThread().getName()
+ ": 将变形金刚设置成 :" + str);
transformer.setType(str);
TimeUnit.SECONDS.sleep(2); String type = transformer.getType(); System.out.println(Thread.currentThread().getName()
+ ": 获取到的变形金刚是:" + type); } catch (InterruptedException e) {
e.printStackTrace();
}
} } @Override
public void run() {
play();
} }

Transformer.java

 import java.util.HashMap;
import java.util.Map; /*
* 每个线程都有且仅有一个 该类对象的引用。
* 不应该在外部类中随便的去new 所以构造方法私有
*
*/
public class Transformer { private static Map<Thread, Transformer> maps = new HashMap<Thread, Transformer>(); private String type; private Transformer(){} public static Transformer getInstance() {
Transformer instance = maps.get(Thread.currentThread());
if(instance == null) {
instance = new Transformer();
maps.put(Thread.currentThread(),instance);
}
return instance;
}
public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} }

Transformer2.java(使用ThreadLocal类)

 import java.util.HashMap;
import java.util.Map; /*
* 每个线程都有且仅有一个 该类对象的引用。
*
*/
public class Transformer2 { //private static Map<Thread, Transformer2> maps = new HashMap<Thread, Transformer2>();
private static ThreadLocal<Transformer2> maps = new ThreadLocal<Transformer2>(); private String type; private Transformer2(){} public static Transformer2 getInstance() {
Transformer2 instance = maps.get();
if(instance == null) {
instance = new Transformer2();
maps.set(instance);
}
return instance;
}
public String getType() {
return type;
} public void setType(String type) {
this.type = type;
}
}

测试类:

 public class Test {

     public static void main(String[] args) {

         //Transformer transformer = new Transformer();

         for (int i = 0; i < 3; i++) {
new Thread(new Child()).start();
}
}
}