我对你最初的问题感到困惑。ThreadLocal 是您正在创建的还是已经由其他 API 提供的?
如果您正在制作 ThreadLocal,那么我假设您已经知道您必须覆盖 initialValue() 以便您可以提供初始值。
在这种情况下,您始终可以跟踪是否已调用它并创建了值。
我认为像下面这样的代码会做你想要的:
MyThreadLocal<T> extends ThreadLocal<T>{
Map<Thread,Boolean> myThreadMap = new HashMap<Thread,Boolean>();
protected T initialValue(){
synchronized(myThreadMap){
T value = ... your code to create initial value
myThreadMap.put(Thread.currentThread(),true);
return T;
}
}
public boolean containsThreadValues(){
synchronized(myThreadMap){
return myThreadMap.isEmpty();
}
}
public boolean isInitializedForThisThread(){
synchronized(myThreadMap){
return myThreadMap.get(Thread.currentThread())==true;
}
}
}
myThreadMap 将始终包含旧键,即使对于死线程也是如此。如果您想清除旧密钥,请将其替换为 WeakHashMap。然后,随着曾经使用 ThreadLocal 的线程消失,密钥将被删除。