首页 > 解决方案 > 在子线程仍在运行时清理 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()

标签: javamultithreadingthread-localresource-cleanup

解决方案


推荐阅读