首页 > 解决方案 > 如何为主线程可见的 Java 并行流设置线程本地累加器

问题描述

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

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

基本上,我需要公共 fork-join 线程池中的每个线程都有与之关联的大量累加器,并且当映射器使用 运行Stream.parallel().forEach(...)时,每个线程应该通过在锁中更新其自己的累加器中的某个 bin 来收集结果值-高速公路。在操作结束时,我希望调用线程(主线程)能够从每个工作线程访问累加器,以便它可以进行最终归约以将所有累加器组合成一个累加器数组。

我的想法是使用ConcurrentSkipListMap线程名称索引来存储每个线程本地累加器,但这有很多开销,所以它并不理想。

标签: javamultithreadingconcurrencythread-local-storage

解决方案


推荐阅读