5

環境:

static ThreadLocal<MyType> threadLocalMyType = ...

私が言いたいのは、次のようなことです。

for (ThreadLocalEntry e: threadLocalMyType.getMapLikeThing() {
    // Thread t = e.getKey(); 
    // I don't need the thread value right now, but it might be useful for 
    // something else. 

    MyType theMyType = e.getValue();
    // [...do something with theMyType...]
}
4

3 に答える 3

7

1 つの方法は、これを手動で処理することです。

  • のラッパーを使用するThreadLocal(拡張する)
  • 値が設定されるたびに、スレッドと値の ( static)を保持しますMap

あるいは、リフレクション (getDeclaredMethod()およびsetAccessible(true)) を使用すると、次のことができます。

  • 電話Thread.getThreads()
  • 呼び出しyourThreadLocal.getMap(thread)(上記のスレッドごとに)
  • 電話map.getEntry(yourThreadLocal)

1stがより好ましい。

于 2010-05-08T20:30:03.710 に答える
1

いいえ、内部的に実装が異なるためです。各スレッドには、そのローカルのマップのようなものがあります。やりたいことは、許可されている場合、本質的にスレッドセーフThreadLocalではありません。各スレッドは、それ自体のローカルにアクセスするときに、明らかに同期を使用しません。他のスレッドはそれを実行できないため、同期は必要ありません。このため、他のスレッドからローカル マップにアクセスすることは (可能であれば)、スレッドセーフではありません。

ThreadLocalBozho が示唆したように、値をサブクラス化して別の場所に複製することでそれを行うことができます。その「他の場所」へのアクセスを適切に同期することを忘れないでください。

于 2010-05-08T20:36:58.087 に答える