1. 为什么要给后台任务加进度条?

在 AI 训练、数据迁移、批量文件处理等场景,如果没有视觉反馈,用户会怀疑程序“卡死”。
控制台一行行 System.out.println("处理完第 i 条") 太 low,我们需要百分比 + 已用时间 + 剩余时间的实时刷新。


2. 选型:me.tongfei/progressbar

特点 说明
零依赖 纯 Java 实现,不依赖 JNI
一行接入 ProgressBar.wrap(list, "任务名")
信息全 百分比、速度、ETA(剩余时间)、吞吐量
多风格 控制台、GUI 均可扩展

3. Maven 坐标 & 版本适配(⚠️ 重点)

progressbar 版本 编译 JDK 运行最低 JDK 备注
0.10.x 9 9+ 功能最全,但 不兼容 Java 8
0.7.4 8 8+ 最后一个 Java 8 可用版本,功能已足够

如果你看到 UnsupportedClassVersionError: 53.0,说明用了 0.10.x 却在 Java 8 运行,降级到 0.7.4 即可。

<!-- Java 8 用户 -->
<dependency>
    <groupId>me.tongfei</groupId>
    <artifactId>progressbar</artifactId>
    <version>0.7.4</version>
</dependency>

<!-- Java 11+ 用户 -->
<dependency>
    <groupId>me.tongfei</groupId>
    <artifactId>progressbar</artifactId>
    <version>0.10.0</version>
</dependency>

4. 控制台 3 种用法

4.1 最简洁:wrap 一行搞定

List<String> texts = loadTexts();
for (String txt : ProgressBar.wrap(texts, "向量化")) {
    computeVector(txt);   // 你的耗时操作
}

4.2 手动 step(适合未知总量)

int total = 100_000;
ProgressBar pb = new ProgressBar("任务", total);
for (int i = 0; i < total; i++) {
    doWork(i);
    pb.step();            // 每次 +1
}
pb.close();

4.3 线程池批量任务

ExecutorService pool = Executors.newFixedThreadPool(8);
ProgressBarBuilder pbb = new ProgressBarBuilder()
        .setTaskName("线程池任务")
        .setStyle(ProgressBarStyle.ASCII);   // 某些终端更兼容

List<Future<?>> futures = new ArrayList<>();
for (String txt : texts) {
    futures.add(pool.submit(() -> doWork(txt)));
}
ProgressBar.wrap(futures, pbb).forEach(f -> {
    try { f.get(); } catch (Exception ignored) {}
});
pool.shutdown();

5. 实时效果截图

向量化  42% │██████▍    │ 42000/100000 (00:00:14 / 00:00:19) 3.1k items/s

6. GUI 场景怎么办?

框架 官方组件
Swing JProgressBar + SwingWorker
JavaFX ProgressBar + Task

控制台直接 ProgressBar 即可;Swing/JavaFX 场景 用自带组件更自然,本文不再展开。


7. 完整可运行 Demo(Java 8)

import me.tongfei.progressbar.*;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;

public class ProgressBarDemo {
    public static void main(String[] args) {
        List<String> data = new ArrayList<>();
        for (int i = 0; i < 200; i++) data.add("item-" + i);

        // 一行搞定
        for (String s : ProgressBar.wrap(data, "Demo")) {
            fakeWork();
        }
        System.out.println("✅ 完成!");
    }

    private static void fakeWork() {
        try {
            Thread.sleep(ThreadLocalRandom.current().nextInt(30, 80));
        } catch (InterruptedException ignored) {}
    }
}

运行

mvn package
java -jar target/demo.jar

8. 常见坑 & FAQ

问题 解决
UnsupportedClassVersionError: 53.0 降级到 0.7.4
IDEA 控制台不刷新 勾上 Build → Delegate IDE build/run to Maven
Windows PowerShell 乱码 ProgressBarStyle.ASCIIsetCharset(StandardCharsets.UTF_8)

9. 总结

  1. Java 8:用 0.7.4 即插即用。
  2. Java 11+:直接用 0.10.x,功能更新。
  3. 一行 ProgressBar.wrap(list) 就能拥有专业级进度反馈。
  4. 进度条让后台任务“可视化”,用户体验瞬间拉满!

觉得有用就点个赞👍、收藏⭐,评论区交流更多花式进度条!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐