《黑马程序员》 线程范围内的数据共享2

------- 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);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值