线程范围内共享变量使用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是代码赘余),外部类调用。
- 线程范围内共享变量使用ThreadLocal类详细方法
- android 线程范围内共享变量以及ThreadLocal的使用
- ThreadLocal 线程范围内的共享变量
- ThreadLocal实现线程范围内共享变量
- ThreadLocal线程范围内的共享变量
- 线程范围内共享变量(ThreadLocal)
- ThreadLocal线程范围内的共享变量
- ThreadLocal实现线程范围内的共享变量
- (三) Java多线程详解之线程范围内共享变量及ThreadLocal类使用
- ThreadLocal类实现线程范围内数据共享
- ThreadLocal实现线程范围内共享变量和对象
- 张孝祥ThreadLocal实现线程范围内共享变量(学习笔记)
- 六:java中线程范围内共享变量--ThreadLocal
- Thread学习(八) ThreadLocal实现线程范围内的共享变量
- ThreadLocal线程范围内共享数据
- (5)ThreadLocal类及应用技巧---- 线程范围内共享变量
- (5)ThreadLocal类及应用技巧---- 线程范围内共享变量
- 线程范围内共享变量的概念与作用以及ThreadLocal类及应用修复bug
- TCP(一 协议)
- rem
- mysql 近日用到的一些操作
- 进制之间的转换 Java
- 第一天-HTML5新增部分标签
- 线程范围内共享变量使用ThreadLocal类详细方法
- ionic开发移动应用总结
- Android端应用秒开优化体验
- Java中HashMap遍历的两种方式
- Linux/Unix 判断一个路径是目录还是文件
- 三个开源的ai项目
- Adb connection Error:远程主机强迫关闭了一个现有的连接。
- Wolf and Rabbit hd 1222
- Hadoop单机安装