【多线程】-线程范围内共享数据的两种方式

第一种,声明一个全局的map变量,用来存当前线程范围内的变量,用于线程范围内使用

 

//线程范围内共享变量
public class ThreadScopeShareData {
	
	//声明一个存放全局变量的容器,来保存该变量在该线程范围内的状态
	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() {
				@Override
				public void run() {
					int data = new Random().nextInt();
					System.out.println(Thread.currentThread().getName() + "has put data:" + data);
					threadData.put(Thread.currentThread(), data);
					new A().get();
					new B().get();
				}
			}).start();
		}
	}
	
	static class A{
		public void get(){
			int data = threadData.get(Thread.currentThread());
			System.out.println("A from" + Thread.currentThread().getName() + "get data:" + data);
		}
	}
	
	static class B{
		public void get(){
			int data = threadData.get(Thread.currentThread());
			System.out.println("A from" + Thread.currentThread().getName() + "get data:" + data);
			
		}
	}
}


第二种,采用threadlocal方式(threadlocal这种变量,一个变量只能对应一个threadlocal,threadlocal原理其实就是一个map同上)

 

 

	//线程范围内共享数据
	public class ThreadLocalTest {
	
	        //定义一个threadlocal变量,该threadlocal变量其实就相当于一个map
	        private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();
	        public static void main( String[] args){
	                for (int i = 0; i < 2; i++) {
	                        new Thread(new Runnable() {
	                                @Override
	                                public void run() {
	                                        int data = new Random().nextInt();
	                                        System.out.println(Thread.currentThread().getName() + "has put data:" + data);
	                                        //将数据存到当前线程里面
	                                        threadLocal.set(data);
	                                        new A().get();
	                                        new B().get();
	                                }
	                        }).start();
	                }
	        }
	        
	        static class A{
	                public void get(){
	                        int data = threadLocal.get();
	                        System.out.println("A from" + Thread.currentThread().getName() + "get data:" + data);
	                }
	        }
	        
	        static class B{
	                public void get(){
	                        int data = threadLocal.get();
	                        System.out.println("A from" + Thread.currentThread().getName() + "get data:" + data);
	                        
	                }
	        }
	}

 

 

 

 

 

 

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

女汉纸一枚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值