Java 8 并行流和 ThreadLocal
2022-09-03 07:15:22
						我正在尝试弄清楚如何在Java 8并行流中复制ThreadLocal值。
因此,如果我们考虑一下:
    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);
            }
        }
    }
哪些输出
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
有没有办法让我将 ThreadLocal 从 main() 方法克隆到每次并行执行生成的线程中?
这样我的结果就是:
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
而不是第一个?
 
					 
				 
				    		 
				    		 
				    		 
				    		