Search code examples
javamultithreadingthread-local

Is there no way to iterate over or copy all the values of a Java ThreadLocal?


Context:

static ThreadLocal<MyType> threadLocalMyType = ...

What i'd like is to say something like:

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...]
}

Solution

  • One way would be to handle this manually:

    • use a wrapper of ThreadLocal (extend it)
    • whenever a value is set, keep a (static) Map of Threads and values

    Alternatively, with some reflection (getDeclaredMethod() and setAccessible(true)), you can:

    • call Thread.getThreads()
    • call yourThreadLocal.getMap(thread) (for each of the above threads)
    • call map.getEntry(yourThreadLocal)

    The 1st is more preferable.