java - 在子线程仍在运行时清理 InheritableThreadLocal
问题描述
我们InheritableThreadLocal
在请求级别的 Web 应用程序中使用来存储ApplicationContext
在整个应用程序中使用的对象。有一个异步响应的场景,其中请求创建一个确认 ID 并启动一个子线程并返回确认 ID。最后,ThreadLocal
被删除。
但是,如果子线程运行的时间长于处理请求所需的时间,它似乎会丢失 ApplicationContext(为空)。
伪代码:
doPost() {
ApplicationContext ctx = createApplicationContext(req);
MyThreadLocalContainer.setContext(ctx);
new Thread(new RequestProcessor()).start(); // this seems to lose the ctx
MyThreadLocalContainer.removeContext();
}
MyThreadLocalContainer 的定义:
public class MyThreadLocalContainer {
private static final ThreadLocal<ApplicationContext> APP_CTX = new InheritableThreadLocal<ApplicationContext>();
public static void setContext(ApplicationContext ctx) {
APP_CTX.set(ctx);
}
public static void removeContext() {
APP_CTX.remove();
}
}
在这种情况下如何ThreadLocal
处理清理,而不必等待子线程在调用之前完成removeContext()
?
解决方案
推荐阅读
- python - Adam在keras中如何实现学习率衰减
- ruby - Rspec:在上下文中正确使用 Let?
- c# - 当我认为我已经定义了需要定义的内容时,为什么会出现命名空间错误?
- javascript - 尝试使用 nightmare.js 从搜索结果中获取数据,但出现错误:“无法读取未定义的属性 'click'”
- c# - 数据网格中的 AutoSuggestBox?
- javascript - 将文本字段中的值转换为段落
- python - 如何在用户单击按钮后插入新文本之前测试 Tkinter 文本框小部件的当前文本?
- python - 从 Python 中的配对键字典中检索值
- google-groups - 将电子邮件分配给 google 组类别
- c# - 打开命令提示符并从 Windows 窗体应用程序执行命令