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的python开发者想必都知道flask中核心机制莫过于上下文管理,当然学习flask如果不了解其中的处理流程,可能在很多问题上不能得到解决,当然我在写本篇文章之前也看到了很多博文有关于对flask上下文管理的...
因此, 再通过线程隔离 ThreadLocal 动态数据源上下文来切换数据源; 切换这个操作使用: aop技术进行织入到配置了注解DS的方法上, 方法是与数据库进行交互时的操作; 具体参考代码文件; 数据库创建和表创建请...
当调用 `selectAnyDataSources()` 方法时,它会根据当前线程的上下文信息来返回一个数据源。如果没有设置上下文信息,它会返回默认的数据源。 结合 `ThreadLocal` 和 `AbstractRoutingDataSource`,我们可以轻松地...
:backhand_index_pointing_right:在使用线程池等会池化复用线程的执行组件情况下,提供ThreadLocal值的传递功能,解决异步执行时上下文传递的问题。一个Java标准库本应为框架/中间件设施开发提供的标配能力,本库...
Spring Webflux上下文展示 展示了如何与org.springframework.web.server.WebFilter reactor.util.context.Context进行交互,就像java.lang.ThreadLocal一样。 org.springframework.cloud.spring-cloud-starter-...
多线程示例####1.1 ThreadLocals + ThreadPools 该模块通过确保在 Runnable 执行结束时删除 ThreadLocal 上下文来测试内存泄漏保护####1.2。 分叉和加入本模块用于测试 Fork And Join ####1.3。 通过 RMI 使用信号...
1.先从ThreadLocal中获取,如果能获取到直接返回,如果获取不到则继续第2步 2.从一个static的map中根据上下文的名称获取,如果能获取到则直接返
aop-plugin第一个过滤器,设置不同环境下的上下文(threadlocal),aop根据上下文环境对方法做插件化支持注解跟xml配置
`TransmittableThreadLocal`(`TTL`):在使用线程池等会池化复用线程的执行组件情况下,提供`ThreadLocal`值的传递功能,解决异步执行时上下文传递的问题。一个`Java`标准库本应为框架/中间件设施开发提供的标配能力...
什么是上下文切换? 线程和进程区别 什么是线程和进程? 创建线程有哪几种方式?,如何避免线程死锁 线程的 run()和 start()有什么区别? 什么是 Callable 和 Future? 线程的调度策略 sleep() 和 wait() 有什么区别...
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 映射...
JobAction是可重用的组件,也可以访问上下文参数。 如果您正在寻找易于集成到您的应用程序中的无麻烦的100%Java作业调度框架,那就别无所求。特征 Apache 2.0许可证 〜150 KB罐 内存中多线程作业 在Jobs.xml中定义...
第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解...
第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解...
第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解...
第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解...
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(控制反转)...
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(控制反转)...