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

多线程处理大文本查找字符串出现的次数

@Service
public class LoadFileStringNum {private static final String FILE_PATH = "C:/Users/36995/Desktop/file.txt";private static final String SEARCH_STRING = "123";public static void main(String[] args) {// 设置线程池大小int numThreads = Runtime.getRuntime().availableProcessors();ExecutorService executor = Executors.newFixedThreadPool(numThreads);List<Future<Long>> futures = new ArrayList<>();long total = 0;try (BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH))) {// 获取文件总行数,用于计算每个线程负责的行数long totalLines = reader.lines().count();// 计算每个线程负责的行数long linesPerThread = totalLines / numThreads;// 提交任务给线程池long startLine = 0;for (int i = 0; i < numThreads; i++) {long endLine = startLine + linesPerThread;if (i == numThreads - 1) {// 最后一个线程处理剩余的行数endLine = totalLines;}futures.add(executor.submit(new SearchTask(FILE_PATH, SEARCH_STRING, startLine, endLine)));startLine = endLine;}// 等待所有任务完成for (Future<Long> future : futures) {total += future.get();}System.out.println("总数: " + total);} catch (Exception e) {System.out.println(e.getMessage());} finally {executor.shutdown();}}
}
public class SearchTask implements Callable<Long> {private final String filePath;private final String searchWord;private final long startLine;private final long endLine;public SearchTask(String filePath, String searchWord, long startLine, long endLine) {this.filePath = filePath;this.searchWord = searchWord;this.startLine = startLine;this.endLine = endLine;}@Overridepublic Long call() throws Exception {long sum = 0;try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {// 跳过前面的行数for (long i = 0; i < startLine; i++) {reader.readLine();}// 查找关键词String line;long lineNumber = startLine + 1;while ((line = reader.readLine()) != null && lineNumber <= endLine) {int index = line.indexOf(searchWord);while (index != -1) {sum++;index = line.indexOf(searchWord, index + 1);}lineNumber++;}}return sum;}
}

相关文章:

  • 使用大型语言模型进行文档解析(附带代码)
  • PyCharm 2024.1最新变化
  • Vue使用FullCalendar实现日历/周历/月历
  • LeetCode 2844.生成特殊数字的最少操作(哈希表 + 贪心)
  • C语言系统调用linux文件系统
  • Linux网络:传输层协议TCP(二)三次挥手四次握手详解
  • Vue 实现电子签名并生成签名图片
  • java学习--枚举
  • scrapy生成爬虫数据为excel
  • XLua 原理分析 三
  • 返回倒数第 k 个节点 - 力扣(LeetCode)
  • 记录|C# winform布局学习
  • ES中的数据类型学习之ARRAY
  • ChatGPT:宽列数据库是什么?
  • 环境搭建-Docker搭建MySQL
  • 时间复杂度分析经典问题——最大子序列和
  • 【翻译】babel对TC39装饰器草案的实现
  • Android 架构优化~MVP 架构改造
  • create-react-app项目添加less配置
  • Javascript Math对象和Date对象常用方法详解
  • javascript数组去重/查找/插入/删除
  • jdbc就是这么简单
  • React-生命周期杂记
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Vue--数据传输
  • zookeeper系列(七)实战分布式命名服务
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 码农张的Bug人生 - 见面之礼
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 如何使用 JavaScript 解析 URL
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 2017年360最后一道编程题
  • ​​​​​​​​​​​​​​Γ函数
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​批处理文件中的errorlevel用法
  • !!Dom4j 学习笔记
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #### golang中【堆】的使用及底层 ####
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #pragma pack(1)
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (16)Reactor的测试——响应式Spring的道法术器
  • (十八)三元表达式和列表解析
  • (四)图像的%2线性拉伸
  • (一)、python程序--模拟电脑鼠走迷宫
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • ../depcomp: line 571: exec: g++: not found
  • .java 9 找不到符号_java找不到符号
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net core Redis 使用有序集合实现延迟队列
  • .Net Core 中间件与过滤器