• 线程范围内的环境变量---ThreadLocal


    package cn.itcast.heima2;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    
    public class ThreadScopeShareData {
    
    	private static int data = 0;
    	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("B from " + Thread.currentThread().getName() 
    					+ " get data :" + data);
    		}		
    	}
    }
    

      从上面代码可以看出,这是模拟ThreadLocal的写法,其实ThreadLocal的功能就是一个以当前线程名为key的Map的存储结构。

      再对上面代码进行优化,可得到这样:

    package cn.itcast.heima2;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    
    public class ThreadScopeShareData {
    
    	private static int data = 0;
    	private static ThreadLocal<Integer> threadData = 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);
    					threadData.set(data);
    					new A().get();
    					new B().get();
    				}
    			}).start();
    		}
    	}
    
    	static class A{
    		public void get(){
    			int data = threadData.get();
    			System.out.println("A from " + Thread.currentThread().getName()
    					+ " get data :" + data);
    		}
    	}
    
    	static class B{
    		public void get(){
    			int data = threadData.get();
    			System.out.println("B from " + Thread.currentThread().getName()
    					+ " get data :" + data);
    		}
    	}
    }
    

      由于上面A,B两个类都属于内部静态类,所以他们可以共享变量 threadData,如果是写到外面,那么ThreadLocal<Integer>就要通过参数进行传递,如下:

    package cn.itcast.heima2;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    
    public class ThreadScopeShareData {
    
    	private static int data = 0;
    	private static ThreadLocal<Integer> threadData = 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);
    					threadData.set(data);
    					new A().get(threadData);
    					new B().get(threadData);
    				}
    			}).start();
    		}
    	}
    
    
    }
    
     class A{
    	public void get(ThreadLocal<Integer> threadData){
    		int data = threadData.get();
    		System.out.println("A from " + Thread.currentThread().getName()
    				+ " get data :" + data);
    	}
    }
    
     class B{
    	public void get(ThreadLocal<Integer> threadData){
    		int data = threadData.get();
    		System.out.println("B from " + Thread.currentThread().getName()
    				+ " get data :" + data);
    	}
    }
    

      

  • 相关阅读:
    golang 的几个入门资料
    docker 容器网络基础
    nginx 容器反向代理网址的设置
    【知乎Live】狼叔:如何正确的学习Node.js
    nginx资料汇总
    web 框架
    work behind corp proxy
    [转载] 历史上前端领域的重要技术革命
    前后端要不要分离以及如何做
    微电子工艺基础知识讲解(集成电路历史/厂商/产业链)
  • 原文地址:https://www.cnblogs.com/lipengsheng-javaweb/p/12521220.html
Copyright © 2020-2023  润新知