java - 如何为主线程可见的 Java 并行流设置线程本地累加器
问题描述
如何为默认(公共)fork-join 池中的每个工作线程设置一些线程本地存储,以及如何从主线程访问该 TLS?
我需要为 Java 并行流实现“收集器”模式,这类似于 MapReduce 中的 reduce,但在最后的最后一个归约步骤之前,在每个线程中分组的关联操作的部分归约。(请注意,出于性能原因,我不想直接使用 MapReduce 模式——收集器减少了从映射器发送到减速器的数据量。)
基本上,我需要公共 fork-join 线程池中的每个线程都有与之关联的大量累加器,并且当映射器使用 运行Stream.parallel().forEach(...)
时,每个线程应该通过在锁中更新其自己的累加器中的某个 bin 来收集结果值-高速公路。在操作结束时,我希望调用线程(主线程)能够从每个工作线程访问累加器,以便它可以进行最终归约以将所有累加器组合成一个累加器数组。
我的想法是使用ConcurrentSkipListMap
线程名称索引来存储每个线程本地累加器,但这有很多开销,所以它并不理想。
解决方案
推荐阅读
- ios - 如何将步进值传递给 ViewController?
- angular - RxJS Overwrite Timer/Observable 最佳实践
- javascript - 未在 php 文件中定义的 javascript 函数
- android - 使用资源和资源文件进行 Android 本地化
- text-classification - 分析序列分类的 Bert 输出
- puppet - 覆盖 Manifest 中的 Puppet 类变量
- amazon-web-services - 无法将 Route53 配置为指向托管在 S3 上的静态网站的 CloudFront 分发
- python - Flask 中的全局变量返回未定义
- javascript - 将元素添加到容器底部并向上移动元素
- javascript - 如何仅在节点 js 和 ejs 中单击时使按钮提交值