I am trying to figure out how can I copy a ThreadLocal value in Java 8 parallel stream.
So if we consider this:
public class ThreadLocalTest { public static void main(String[] args) { ThreadContext.set("MAIN"); System.out.printf("Main Thread: %s\n", ThreadContext.get()); IntStream.range(0,8).boxed().parallel().forEach(n -> { System.out.printf("Parallel Consumer - %d: %s\n", n, ThreadContext.get()); }); } private static class ThreadContext { private static ThreadLocal<String> val = ThreadLocal.withInitial(() -> "empty"); public ThreadContext() { } public static String get() { return val.get(); } public static void set(String x) { ThreadContext.val.set(x); } } } Which outputs
Main Thread: MAIN Parallel Consumer - 5: MAIN Parallel Consumer - 4: MAIN Parallel Consumer - 7: empty Parallel Consumer - 3: empty Parallel Consumer - 1: empty Parallel Consumer - 6: empty Parallel Consumer - 2: empty Parallel Consumer - 0: MAIN Is there a way for me to clone the ThreadLocal from main() method into the threads which are spawned for each parallel execution ?
Such so that my result is:
Main Thread: MAIN Parallel Consumer - 5: MAIN Parallel Consumer - 4: MAIN Parallel Consumer - 7: MAIN Parallel Consumer - 3: MAIN Parallel Consumer - 1: MAIN Parallel Consumer - 6: MAIN Parallel Consumer - 2: MAIN Parallel Consumer - 0: MAIN instead of the first one?
ThreadLocalin the first place, instead of just created in your main method and then passed on explicitly to the lambda?