私はあなたの最初の質問に混乱しています。あなたが作成している 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 を使用していた Threads がなくなると、キーが削除されます。