当子线程仍在运行时清理InheritableThreadLocal

时间:2018-08-10 03:27:03

标签: java multithreading thread-local resource-cleanup

我们在请求级的Web应用程序中使用InheritableThreadLocal来存储在整个应用程序中使用的ApplicationContext对象。 对于异步响应,存在一种情况,其中请求创建确认ID并启动子线程,然后将确认ID返回。最后,ThreadLocal被删除。

但是,如果子线程运行的时间长于处理请求所花费的时间,则该子线程似乎会丢失ApplicationContext(为null)。

伪代码:

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()之前等待子线程完成?

0 个答案:

没有答案