单线程范围内数据共享使用ThreadLocal

 
/**   
 * @Description    TODO
 * @author         
 * @since          2015年12月12日
 * @version        V1.0
 */

public class DataShare {
    /**
     * ThreadLocal:保存和当前线程相关的变量数据
     * 线程范围内的数据共享 ThreadLocal
     * 优雅的设计方式,Person
     * 每一个线程使用完毕要清空ThreadLocal保存的当前变量
     * 
     * 如何判断一个线程结果:监听器,回调函数
     * 当一个线程结束的时候,主动调用回函数表示函数结束。 
     * 怎么得到线程结束的通知 :ThreadDeathEvent
     * 在虚拟机结束的时候发邮件
     * 
     * ThreadDeatRequest
     * com.sun.jdi.request //sun公司给开发虚拟机用的,不对普通开发人员开放
     * 
     */
    
 
    public static void main(String[] args) {
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                Person.getInstance().setName("zhangsan");
                Person.getInstance().setAge(25);
                new A().getName();
                new B().getName();
                
            }
        }).start();
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                Person.getInstance().setName("lisi");
                Person.getInstance().setAge(28);
                new A().getName();
                new B().getName();
                
            }
        }).start();
    }
    

}

class A{
    public void getName(){
        System.out.println("A "+Thread.currentThread().getName()+":"+Person.getInstance().getName());
    }
}
class B {
    public void getName(){
        System.out.println("B "+Thread.currentThread().getName()+":"+Person.getInstance().getName());
    }
}

Person类(优雅的线程范围共享数据设计):

package com.ctyun.thread.datashare;

/**
 * @Description TODO
 * @author S
 * @since 2015年12月12日
 * @version V1.0
 */

public class Person {
    // 优雅的设计方式,将ThreadLocal封装到bean内部,隐藏变化
    private static ThreadLocal<Person> instance = new ThreadLocal<Person>();

    private Person() {
    }

    public static Person getInstance() {
        Person p = instance.get();
        if (p == null) {
            p = new Person();
            instance.set(p);
        }

        return p;
    }

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

ThreaLocal的remove方法,可以移除当前线程绑定在ThreadLocal上的所有变量数据。

posted on 2015-12-13 09:26  张释文  阅读(620)  评论(0)    收藏  举报