`
benx
  • 浏览: 272745 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用ThreadLocal 做上下文

    博客分类:
  • java
阅读更多

 

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线程登录,访问HttpServlent
		for (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;
	}
}
分享到:
评论

相关推荐

    Flask核心机制之上下文源码剖析

    了解过flask的python开发者想必都知道flask中核心机制莫过于上下文管理,当然学习flask如果不了解其中的处理流程,可能在很多问题上不能得到解决,当然我在写本篇文章之前也看到了很多博文有关于对flask上下文管理的...

    spring_batch.zip

    因此, 再通过线程隔离 ThreadLocal 动态数据源上下文来切换数据源; 切换这个操作使用: aop技术进行织入到配置了注解DS的方法上, 方法是与数据库进行交互时的操作; 具体参考代码文件; 数据库创建和表创建请...

    SpringBoot实现动态切换数据源(含源码)

    当调用 `selectAnyDataSources()` 方法时,它会根据当前线程的上下文信息来返回一个数据源。如果没有设置上下文信息,它会返回默认的数据源。 结合 `ThreadLocal` 和 `AbstractRoutingDataSource`,我们可以轻松地...

    transfertable-thread-local::pushpin:TransmittableThreadLocal(TTL),缺少框架中间件的Java:trade_mark:std lib(简单和0依赖),提供了增强的InheritableThreadLocal,即使使用线程池组件也可以在线程之间传输值

    :backhand_index_pointing_right:在使用线程池等会池化复用线程的执行组件情况下,提供ThreadLocal值的传递功能,解决异步执行时上下文传递的问题。一个Java标准库本应为框架/中间件设施开发提供的标配能力,本库...

    spring-webflux-context-showcase

    Spring Webflux上下文展示 展示了如何与org.springframework.web.server.WebFilter reactor.util.context.Context进行交互,就像java.lang.ThreadLocal一样。 org.springframework.cloud.spring-cloud-starter-...

    redar:Java Swift Knife 项目.. - 线程、Quartz、Spring、Spring Integration、Apache Mina、Python

    多线程示例####1.1 ThreadLocals + ThreadPools 该模块通过确保在 Runnable 执行结束时删除 ThreadLocal 上下文来测试内存泄漏保护####1.2。 分叉和加入本模块用于测试 Fork And Join ####1.3。 通过 RMI 使用信号...

    Sentinel 原理-调用链1

    1.先从ThreadLocal中获取,如果能获取到直接返回,如果获取不到则继续第2步 2.从一个static的map中根据上下文的名称获取,如果能获取到则直接返

    aop-plugin:aop,一个方法多个公司的差异需求,插件化

    aop-plugin第一个过滤器,设置不同环境下的上下文(threadlocal),aop根据上下文环境对方法做插件化支持注解跟xml配置

    transmittable-thread-local.zip

    `TransmittableThreadLocal`(`TTL`):在使用线程池等会池化复用线程的执行组件情况下,提供`ThreadLocal`值的传递功能,解决异步执行时上下文传递的问题。一个`Java`标准库本应为框架/中间件设施开发提供的标配能力...

    java并发编程面试题

    什么是上下文切换? 线程和进程区别 什么是线程和进程? 创建线程有哪几种方式?,如何避免线程死锁 线程的 run()和 start()有什么区别? 什么是 Callable 和 Future? 线程的调度策略 sleep() 和 wait() 有什么区别...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    10.3.1 持久化上下文和持久化单元 382 10.3.2 实体类的要求 382 10.3.3 实体的状态 383 10.3.4 管理实体的方法 384 10.4 实体的基本映射387 10.4.1 映射实体类的属性 387 10.4.2 将实体映射到多个表 394 10.4.3 映射...

    Sundial:轻量级作业计划框架

    JobAction是可重用的组件,也可以访问上下文参数。 如果您正在寻找易于集成到您的应用程序中的无麻烦的100%Java作业调度框架,那就别无所求。特征 Apache 2.0许可证 〜150 KB罐 内存中多线程作业 在Jobs.xml中定义...

    龙果 java并发编程原理实战

    第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解...

    Java 并发编程原理与实战视频

    第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解...

    龙果java并发编程完整视频

    第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解...

    java并发编程

    第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解...

    Spring API

    2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)...

    Spring中文帮助文档

    2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)...

Global site tag (gtag.js) - Google Analytics