线程范围内共享变量使用ThreadLocal类详细方法

来源:互联网 发布:淘宝店铺号和旺旺号 编辑:程序博客网 时间:2024/06/02 17:21

class ThreadLocal<T>



其中get()方法:取得当前线程范围内共享变量的值。
set()方法:把当前共享变量的值存到ThreadLocal(T)里面。

即get()是得到ThreadLocal里面的共享变量值,set()是存储ThreadLocal里面共享变量的值。


例题:线程0和线程1同时用class A和class B取得name和age两个值。

package cn.itcast.heima2;import java.util.HashMap;import java.util.Map;import java.util.Random;public class ThreadLocalTest {private static ThreadLocal<Integer> x = new ThreadLocal<Integer>();private static ThreadLocal<MyThreadScopeData> myThreadScopeData = new ThreadLocal<MyThreadScopeData>();public static void main(String[] args) {for(int i=0;i<2;i++){new Thread(new Runnable(){ @Overridepublic void run() {int data = new Random().nextInt();System.out.println(Thread.currentThread().getName() + " has put data :" + data);x.set(data);/*MyThreadScopeData myData = new MyThreadScopeData();myData.setName("name" + data);myData.setAge(data);myThreadScopeData.set(myData);*/MyThreadScopeData.getThreadInstance().setName("name" + data);MyThreadScopeData.getThreadInstance().setAge(data);new A().get();new B().get();}}).start();}}static class A{public void get(){int data = x.get();System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data);/*MyThreadScopeData myData = myThreadScopeData.get();;System.out.println("A from " + Thread.currentThread().getName() + " getMyData: " + myData.getName() + "," +myData.getAge());*/MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();System.out.println("A from " + Thread.currentThread().getName() + " getMyData: " + myData.getName() + "," +myData.getAge());}}static class B{public void get(){int data = x.get();System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data);MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();System.out.println("B from " + Thread.currentThread().getName() + " getMyData: " + myData.getName() + "," +myData.getAge());}}}class MyThreadScopeData{private MyThreadScopeData(){}         //私有化构造方法,通过getThreadInstance访问类public static /*synchronized*/ MyThreadScopeData getThreadInstance(){MyThreadScopeData instance = map.get();if(instance == null){instance = new MyThreadScopeData();map.set(instance);}return instance;}//private static MyThreadScopeData instance = null;//new MyThreadScopeData();private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();private String name;private int age;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;}}


运行结果:

Thread-0 has put data :-960708810
A from Thread-0 get data :-960708810
A from Thread-0 getMyData: name-960708810,-960708810
Thread-1 has put data :1093825706
B from Thread-0 get data :-960708810
B from Thread-0 getMyData: name-960708810,-960708810
A from Thread-1 get data :1093825706
A from Thread-1 getMyData: name1093825706,1093825706
B from Thread-1 get data :1093825706
B from Thread-1 getMyData: name1093825706,1093825706


ps:其中把Age和Name封装在MyThreadScopeData类里面,并且私有化构造方法,外面无法实例化类对象,通过单例模式在getTreadInstance方法里面定义MyThreadScopeData对面并且通过ThreadLocal<MyThreadScopeData>  get得到map的值,从而实现数据的传递。

在外部main函数里面调用MyThreadScopeData的时候是通过MyThreadScopeData.getTreadInstance.set(data)设置存储MyThreadScopeData的值的。


简单说就是MyThreadScopeData定义静态方法,main函数设置存储共享变量,外部类class  A和class  B取得存储的共享变量,实现相同变量,不同线程使用,值不相同的效果。


这次主要运用到了java高类聚性的思想,把多个变量封装在一个类里面(避免了定义多个ThreadLocal是代码赘余),外部类调用。

0 0
原创粉丝点击