ThreadLocal和InheritableThreadLocal的使用

ThreadLocal
可以在在线程内实现一个局部变量,可以在线程的任何地方来访问,能够减少参数的传递
package  jp.co.realseed;
public   class  ThreadLocalTest  {
    
private static ThreadLocal tl_1 = new ThreadLocal(){
        
//返回本线程的名字,变量1
        protected Object initialValue() {
            
return  "Thread name 1 : "+Thread.currentThread().getName();
        }

    }
;
    
private static ThreadLocal tl_2 = new ThreadLocal(){
        
//返回本线程的名字,变量2
        protected Object initialValue() {
            
return  "Thread name 2 : "+Thread.currentThread().getName();
        }

    }
;
    
public static void main(String[] args) {
        
for (int i = 0; i < 10; i++{
            
new Thread(new Runnable(){
                
public void run() {
                    
new ThreadLocalTest().prt();
                }

            }
).start();
        }

    }

    
//打印本线程的名字
    public void prt(){
        System.out.println(tl_1.get());
        System.out.println(tl_2.get());
    }

}


InheritableThreadLocal
可以在子线程和父线程之间共享实例,也同样是为了减少参数的传递
package  jp.co.realseed;
public   class  InheritableThreadLocalTest  {
    
private static InheritableThreadLocal ITL = new InheritableThreadLocal(){
        
protected Object initialValue() {
            
return new StringBuffer("hello");
        }

    }
;
    
public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName()
+" : "+ITL.get());
        
new Thread(new Runnable(){
            
public void run() {
                System.out.println(Thread.currentThread().getName()
+" : "+ITL.get());
                
new Thread(new Runnable(){
                    
public void run() {
                        System.out.println(Thread.currentThread().getName()
+" : "+ITL.get());
                        ((StringBuffer)ITL.get()).append(
", wqf");
                        System.out.println(Thread.currentThread().getName()
+" : "+ITL.get());
                    }

                }
).start();
                
try {
                    Thread.sleep(
1000);
                }
 catch (InterruptedException ex) {
                    ex.printStackTrace();
                }

                System.out.println(Thread.currentThread().getName()
+" : "+ITL.get());
            }
}
).start();
        
try {
            Thread.sleep(
1000);
        }
 catch (InterruptedException ex) {
            ex.printStackTrace();
        }

        System.out.println(Thread.currentThread().getName()
+" : "+ITL.get());
    }


}

你可能感兴趣的:(java)