如何为主线程可见的Java并行流设置线程本地累加器

如何为主线程可见的Java并行流设置线程本地累加器,java,multithreading,concurrency,thread-local-storage,Java,Multithreading,Concurrency,Thread Local Storage,如何在默认(公共)fork-join池中为每个工作线程设置一些线程本地存储,以及如何从主线程访问该TLS 我需要为Java并行流实现“收集器”模式,这类似于MapReduce中的reduce,但是在最后的一个缩减步骤之前,在每个线程中分组关联操作的部分缩减。(注意,出于性能原因,我不想直接使用MapReduce模式——收集器减少了从映射器发送到还原器的数据量。) 基本上,我需要公共fork-join线程池中的每个线程都有一个与之关联的大型累加器数组,当映射程序使用Stream.parallel(

如何在默认(公共)fork-join池中为每个工作线程设置一些线程本地存储,以及如何从主线程访问该TLS

我需要为Java并行流实现“收集器”模式,这类似于MapReduce中的reduce,但是在最后的一个缩减步骤之前,在每个线程中分组关联操作的部分缩减。(注意,出于性能原因,我不想直接使用MapReduce模式——收集器减少了从映射器发送到还原器的数据量。)

基本上,我需要公共fork-join线程池中的每个线程都有一个与之关联的大型累加器数组,当映射程序使用
Stream.parallel().forEach(…)
运行时,每个线程都应该通过以无锁方式更新自己累加器中的某些bin来收集结果值。在操作结束时,我希望调用线程(主线程)能够从每个工作线程访问累加器,这样它就可以进行最后的reduce,将所有累加器合并到一个累加器数组中


我的想法是使用一个按线程名称索引的
ConcurrentSkipListMap
来存储每个线程本地累加器,但这会带来很多开销,因此并不理想。

您签出了吗?这里有一个指南:。这可能是一个有用的工具。是的,我知道
ThreadLocal
。但一旦流结束并将控制权传递回主线程,我需要从所有线程获取所有
ThreadLocal
值。这就是问题所在。你退房了吗?这里有一个指南:。这可能是一个有用的工具。是的,我知道
ThreadLocal
。但一旦流结束并将控制权传递回主线程,我需要从所有线程获取所有
ThreadLocal
值。这就是问题所在。