正如Louis在评论中所述,您的示例可以简化为捕获lambda表达式中的局部变量的值
public static void main(String[] args) { String value = "MAIN"; System.out.printf("Main Thread: %sn", value); IntStream.range(0,8).boxed().parallel().forEach(n -> { System.out.printf("Parallel Consumer - %d: %sn", n, value); });}从您的示例中看不出完整的用例是什么。
如果您确切知道将从主线程 启动
的线程,则可以考虑使用
InheritableThreadLocal
此类扩展
ThreadLocal为提供 从父线程到子线程的值继承 :创建 子线程
时,子级将接收父级具有值的所有可继承线程局部变量的初始值。
在你的情况下,宣布
val作为
InheritableThreadLocal,因为
Thread实例为创建
parallel()中
ForkJoinPool#commonPool()懒洋洋地创建,他们会从值的所有继承
set的
main方法(和线程)。
如果您在原始线程中设置值之前以某种方式使用了
commonPool(或
parallel调用了终端操作的任何池),情况就不会如此
InhertiableThreadLocal。



