单线程范围内数据共享使用ThreadLocal
/** * @Description TODO * @author [email protected] * @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 [email protected] * @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上的所有变量数据。
时间: 2024-11-14 05:26:27