31

ThreadLocal を作成し、それを new ThreadLocal で初期化するという問題が発生しています。問題は、概念的には、スレッドの寿命が続く永続的なリストが必要なだけですが、Java でスレッドごとに何かを初期化する方法があるかどうかわかりません。

たとえば、私が欲しいのは次のようなものです:

ThreadLocal static {
  myThreadLocalVariable.set(new ArrayList<Whatever>());
}

スレッドごとに初期化するようにします。私はこれを行うことができることを知っています:

private static Whatever getMyVariable() {
  Whatever w = myThreadLocalVariable.get();
  if(w == null) {
    w = new ArrayList<Whatever>();
    myThreadLocalVariable.set(w);
  }
  return w; 
}

しかし、使用するたびにチェックする必要はありません。ここでできることはありますか?

4

3 に答える 3

41

initialValue()メソッドをオーバーライドするだけです:

private static ThreadLocal<List<String>> myThreadLocal =
    new ThreadLocal<List<String>>() {
        @Override public List<String> initialValue() {
            return new ArrayList<String>();
        }
    };
于 2013-03-12T18:43:42.080 に答える
20

あなたの解決策は問題ありません。少し単純化:

private static Whatever getMyVariable() 
{
    Whatever w = myThreadLocalVariable.get();
    if(w == null) 
        myThreadLocalVariable.set(w=new Whatever());
    return w; 
} 

Java 8 では、次のことができます。

ThreadLocal<ArrayList<Whatever>> myThreadLocal = ThreadLocal.withInitial(ArrayList::new);

Supplier<T>関数型インターフェースを使用します。

于 2013-03-12T19:00:44.710 に答える