zoukankan      html  css  js  c++  java
  • 线程范围内的环境变量---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);
    	}
    }
    

      

  • 相关阅读:
    Windows Phone 开发——相机功能开发
    IE8 margin:0 auto 不能居中显示的问题
    YUI Compressor JS和CSS压缩工具使用方式(使用前安装JDK)
    Javascript日常编码中的一些常见问题
    NODESCHOOL
    js动态加载css和js
    JS this用法详解
    getElementsByTagName( )方法
    js 停止事件冒泡 阻止浏览器的默认行为(比如阻止超连接 # )
    跨浏览器的事件对象
  • 原文地址:https://www.cnblogs.com/lipengsheng-javaweb/p/12521220.html
Copyright © 2011-2022 走看看