CountDownLatch 实现海量日志并行分析与进度看板的核心是主线程等待所有子任务完成并实时反映进度:通过 latch.await() 阻塞主线程,配合 AtomicInteger progress 实时更新完成批次,前端轮询获取进度百分比及状态。

用 CountDownLatch 实现海量日志的并行分析与进度看板,核心是:**让主线程等待所有分析子任务完成,同时通过共享计数器实时反映进度**。它不直接提供“进度百分比”,但可配合原子变量或线程安全容器轻松构建可视化看板。
1. 划分日志批次 + 启动并行任务
把海量日志按固定大小(如 10,000 行/批)切分成多个 List<logentry></logentry>,每批交给一个独立线程处理:
- 创建
CountDownLatch latch = new CountDownLatch(batchList.size()) - 用
ExecutorService提交每个批次的分析任务(例如统计错误码频次、提取异常堆栈等) - 每个任务执行完后调用
latch.countDown()
2. 实时进度跟踪(关键!)
CountDownLatch 本身不可重置、也不暴露剩余数量,所以需额外维护一个线程安全的进度变量:
- 声明
AtomicInteger progress = new AtomicInteger(0) - 每个子任务结束前执行
progress.incrementAndGet() - 前端轮询接口(如 Spring Boot 的
@GetMapping("/progress"))返回progress.get() + "/" + batchList.size() - 也可用
ConcurrentHashMap<string integer></string>记录各批次状态,支持更细粒度监控
3. 主线程阻塞等待 + 汇总结果
分析启动后,主线程调用 latch.await() 阻塞,直到所有批次完成:
- 可设超时避免无限等待:
latch.await(10, TimeUnit.MINUTES) - 超时后检查
progress.get()判断是否卡死或部分失败 - 所有子任务通常将结果写入线程安全容器(如
ConcurrentLinkedQueue或CopyOnWriteArrayList),主线程最后统一合并
4. 进度看板简单实现示例
Spring Boot 中暴露一个轻量端点:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@RestController
public class ProgressController {
private final AtomicInteger progress = new AtomicInteger(0);
private final int totalBatches;
<pre class="brush:php;toolbar:false;">public ProgressController(int totalBatches) {
this.totalBatches = totalBatches;
}
@GetMapping("/api/progress")
public Map<string object> getProgress() {
int current = progress.get();
return Map.of(
"done", current,
"total", totalBatches,
"percent", Math.round(100.0 * current / totalBatches),
"status", current == totalBatches ? "FINISHED" : "RUNNING"
);
}</string>}
前端每 2 秒请求一次,渲染进度条和数字即可。
不复杂但容易忽略:务必确保 progress.incrementAndGet() 在子任务真正完成(包括结果落库、文件写入等)之后调用,否则进度会“假完成”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










