当前位置: 首页 > article >正文

《Java核心技术I》映射条目的原子更新

映射条目的原子更新

ConcurrentHashMap只有部分原子更新。

JavaAPI提供了一些新方法,例如:compute方法可以提供一个键和一个计算新值的函数。

map.compute(word,(k,v)->v == null ? 1 : v+1)

注释:ConcurrentHashMap中不允许有null值。很多方法都使用null来指示映射中某个给定的键不存在。

使用并发散列映射来统计一个目录树的Java文件中的所有单词

package concurrentHashMap;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Scanner;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class CHMDemo {
    
    public static ConcurrentHashMap<String,Long> map = new ConcurrentHashMap<>();
    
    public static void process(Path file) {
        try(var in = new Scanner(file)){
            while(in.hasNext()) {
                String word = in.next();
                map.merge(word, 1L, Long::sum);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static Set<Path> descendants(Path rootDir) throws IOException{
        try(Stream<Path> entries = Files.walk(rootDir)){
            return entries.collect(Collectors.toSet());
        }
    }

    public static void main(String[] args) throws InterruptedException, IOException {
        int processors = Runtime.getRuntime().availableProcessors();
        ExecutorService executor = Executors.newFixedThreadPool(processors);
        Path pathToRoot = Path.of("C:\\Program Files\\Java\\jdk1.8.0_131\\src");
        for (Path p : descendants(pathToRoot)) {
            if(p.getFileName().toString().endsWith(".java")) {
                executor.execute(()->process(p));
            }
        }
        executor.shutdown();
        executor.awaitTermination(10, TimeUnit.MINUTES);
        map.forEach((k,v)->{
            if(v>=10)
                System.out.println(k+" occurs "+v+" times");
        });
    }

}


http://www.kler.cn/a/429161.html

相关文章:

  • 【Unity3D】利用Hinge Joint 2D组件制作绳索效果
  • C++速览之智能指针
  • 在.NET用C#将Word文档转换为HTML格式
  • WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测
  • 51c大模型~合集106
  • Digital Document System (DDS)
  • Ubuntu压缩打包解压
  • [创业之路-187]:《华为战略管理法-DSTE实战体系》-1-从UTStarcom的发展历程,如何辩证的看企业初期发展太顺利中的危机
  • 第1章 Linux系统安装向日葵
  • React 初学者指南:从零开始构建第一个 React 应用
  • 机器学习实战学习笔记:前言与准备
  • 二分模板题
  • 在 Ubuntu 24 上安装 Redis 7.0.15 并配置允许所有 IP 访问
  • JMeter Java请求开发方法
  • Ubuntu 22.04加Windows AD域
  • 【Ubuntu】清理、压缩VirtualBox磁盘空间大小
  • 探索 Webpack:前端工程化的核心驱动力与应用场景全解析
  • 高级java每日一道面试题-2024年12月08日-JVM篇-什么是类加载器?
  • 【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!
  • C++运算符重载的使用——实现日期类
  • Leaflet Marker的突出显示,以及聚合
  • 医院专家抽取系统——未来之窗行业应用跨平台架构
  • Android开发-----Could not install Gradle distribution from- gradle
  • 在 Windows WSL 上部署 Ollama 和大语言模型:从镜像冗余问题看 Docker 最佳实践20241208
  • 泷羽sec学习打卡-brupsuite4
  • 高级数据结构-树状数组