【问题标题】:Carriage return '\r' not reliable when frequently updating the console频繁更新控制台时回车“\r”不可靠
【发布时间】:2017-09-10 07:41:36
【问题描述】:

我正在控制台中显示进度,并使用“\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 显示更新速度之间的差异。我不希望我的程序运行得更慢,只是为了让控制台输出看起来不错。我该如何解决这个问题?

【问题讨论】:

  • 需要帮助,如何解决,我想在java控制台中取得进展。
  • 为了将来参考,请将代码包含在您的问题中。如果您这样做,您将更有可能在您的问题上获得帮助。

标签: java console progress


【解决方案1】:

一种选择是将您的代码分成两个线程,并行运行。您的工作线程执行所有工作逻辑,并更新“进度”变量。您的 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 代码在应用程序逻辑的单独线程上运行是很常见的,主要是这样当某些事情需要很长时间时,它不会阻止用户进行交互 - 他们仍然可以单击关闭,在选项卡之间切换等。

【讨论】:

  • “Thread.sleep(240);” ,如果你低于 240,比如 IDE 控制台中的 20ms,10ms,你会发现它不可靠,但在 linux shell 中它工作正常。我不知道其他人是做什么的,比如'\b'。
  • 是的,这段代码的重点是您可以选择任何更新频率,而不会影响您的工作人员运行速度。这是一个相当随意的选择——即使你选择了 1 秒的睡眠,在慢速计算机上你可能仍然会遇到同样的问题。这是我能想到的最佳解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 2013-08-23
  • 1970-01-01
相关资源
最近更新 更多