我在控制台中显示进度,并使用'\ r'字符清除每次更新as per this answer之间的界限。
public class MainTest {
public static int delay = 10;
public static void main(String[] args) {
for (int i = 0; i <= 100; i++) {
System.out.print("\r");
System.out.print("process:" + i + "%");
Thread.sleep(delay);
}
}
}
延迟240毫秒或更长时间,似乎工作正常。但是,一旦我低于此值,'\ r'字符就不可靠了。它看起来很紧张,并不总是清除线条,所以最后你会看到
process:97%process:98%process:99%process:100%
This gif显示更新速度之间的差异。我不希望我的程序运行得更慢,只是为了让控制台输出看起来不错。我该如何解决这个问题?
答案 0 :(得分:0)
一种选择是将代码拆分为两个并行运行的线程。您的工作线程会完成所有工作逻辑,并更新“进度”变量。您的UI线程会不时地读取进度,并在控制台中显示它。
import java.util.concurrent.atomic.AtomicInteger;
public class HelloWorld
{
public static void main(String[] args) throws InterruptedException
{
final AtomicInteger progress = new AtomicInteger(0);
Thread worker = new Thread(new Runnable() {
public void run() {
for (int i = 0; i <= 100; i++) {
try {
// Do some work here
Thread.sleep(1);
progress.set(i);
} catch (InterruptedException e) {
progress.set(100);
}
}
}
});
worker.start();
while (progress.get() < 100) {
// Now you can choose how often to update the console, without
// slowing down your worker.
Thread.sleep(240);
System.out.print("\r");
System.out.print("Progress: " + progress.get() + "%");
}
worker.join();
}
}
UI代码在应用程序逻辑的单独线程上运行是很常见的,主要是因为当某些事情花费很长时间时,它不会阻止用户进行交互 - 他们仍然可以单击关闭,在标签等之间切换