首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

使用ThreadLocal 做下上文

2012-12-28 
使用ThreadLocal 做上下文?package Local/** * 本例子主要是测试ThreadLocal,其实ThreadLoacl内部非常的

使用ThreadLocal 做上下文

?

package Local;/** * 本例子主要是测试ThreadLocal,其实ThreadLoacl内部非常的简单,主要是内部维护一个ThreadLocalMap,为什么要自己维护一个ThreadLocalMap呢? *而使用HashMap, 因为ThreadLocalMap里面得Entry是WeakReference(弱引用)的,便于垃圾回收。 * ThreadLocal 中 的Map 以Thread.currentThread 为key *  * @author Administrator *  */public class ThreadLocalTest {public static void main(String[] args) {// 模拟HttpServlent 单例UserServlet servlent = new UserServlet();// 模拟10线程登录,访问HttpServlentfor (int i = 0; i < 10; i++) {new UserLoginThread(servlent, new User("User " + i)).start();}}}/** * 模拟一个线程登录 * @author Administrator * */class UserLoginThread extends Thread {UserServlet userServlent;User user;public UserLoginThread(UserServlet userServlent, User user) {super();this.userServlent = userServlent;this.user = user;}public void run() {super.run();userServlent.doPost(user);}}/** * 模拟HttpServlent 登录 *  * @author Administrator *  */class UserServlet {MyService service = new MyService();public void doPost(User user) {UserContext.login(user);work();}public void work() {/** * 这里可能调用其他的Service,Service类里面只要没有开其他线程,那么如果要使用当前登录的User都可以使用UserContext * .getUser() 方法来获取User,好处是不需要处处传递User */service.printlnUser();}}class MyService {public void printlnUser() {System.out.println(Thread.currentThread().getName() + "  "+ UserContext.getUser().getName());}}/** * User上下文 *  * @author Administrator *  */class UserContext {static ThreadLocal<User> context = new ThreadLocal<User>();public static void login(User user) {context.set(user);}public static User getUser() {return context.get();}}/** * 用户 *  * @author Administrator *  */class User {private String name;public User(String name) {super();this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

热点排行