-------
android培训、
java培训、期待与您交流! ----------
public class ThreadScopeShareData {
/**
* 线程范围内的数据共享 先做成
* Thread-0 has put data :1103365972
* ModuleA from:Thread-0 get data :1103365972
* ModuleB from:Thread-0 get data :1103365972
* 只有一个线程 然后再将这样的操作循环两次。
* 即有两个线程里面有三个 模块 。
第一个模块添加数据。第二,第三个模块获取A模块 添加的数据
* 就像我们的银行系统中的,第一个模块添加和线程绑定的connection对象 为了避免在转入,
* 转出业务过程中出现程序错误导致业务办理失败。 要求要么同时成功,要么同时失败的事务
* 的开始与提交所做使的是connection是同一个 即是我们第一个模块绑定的connection对象
*
* Thread-0 has put data :370648504 ModuleA from:Thread-0 get data
* :370648504 ModuleB from:Thread-0 get data :370648504 Thread-1 has put
* data :532514467 ModuleA from:Thread-1 get data :532514467 ModuleB
* from:Thread-1 get data :532514467
*
* 我们使用线程范围内的数据共享实现了以下的效果:
* Thread-1 has put data :-1550085625
Thread-0 has put data :1853418469
ModuleA from:Thread-0 get data :1853418469
ModuleA from:Thread-1 get data :-1550085625
ModuleB from:Thread-1 get data :-1550085625
ModuleB from:Thread-0 get data :1853418469
线程范围内的共享的数据,即一个线程上,它的所有的模块取到的数据都是相同的。
在线程内的所有模块中是独立的(因为它是被当前线程上的某个模块添加),被所有的
模块所共享的(因为当前线程上的所有的模块获取的值是这个共享的数据),在线程外是独立的。
*/
private static int data = 0;
// 我们要实现范围内的数据共享
// 即线程上的所有的模块使用的对象都是同一个
// 我们可以使用map集合来实现,把线程和数据给封装成EntrySet对象。填充到 map集合中
private static Map<Thread, Integer> threadData = new HashMap<Thread, Integer>();
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();
System.out.println(Thread.currentThread().getName()
+ " has put data :" + data);
// 把当前的线程和要做为在当前线程内共享的数据添加到map集合中
//把当前的线程做为key,把共享的数据做为value添加到map集合中
threadData.put(Thread.currentThread(), data);
new ModuleA().getData();
new ModuleB().getData();
}
}).start();
}
}
static class ModuleA {
public void getData() {
//从集合中获取数据
//集合中存放的是其实是当前线程和在线程上所共享的数据
int data=threadData.get(Thread.currentThread());
System.out.println("ModuleA from:"
+ Thread.currentThread().getName() + " get data :" + data);
}
}
static class ModuleB {
public void getData() {
int data=threadData.get(Thread.currentThread());
System.out.println("ModuleB from:"
+ Thread.currentThread().getName() + " get data :" + data);
}
}
}