如何在控制台中打印多行进度列表

时间:2018-05-16 08:27:55

标签: java

我只是编写一种方法来在控制台中打印进度条。它可以像这样打印:

[>>>>>>>>>>>>>>>>>>>> ====== ===============================]

public void progress(int percent){
    System.out.print('\r');
    String progressText = "[" + StringUtils.repeat(">", percent) + StringUtils.repeat("=", 100-percent) + "]";
    System.out.print(progressText);
}

但它只能在单线程和单线路中工作。 有没有办法用多线程打印多线,如
Thread-1:[>>>>>>>>>>>>>>>>>>>>>> ===== ================================]
Thread-2:[>>>>>>>>>>>>>>>>>>>>>>>>>>> ; ==================================]

我想要它像yum install xxx -y在centos中的进度线。
有可能吗?

2 个答案:

答案 0 :(得分:0)

您可以创建方法synchronized并使用Thread.currentThread().getName()打印调用此方法的线程的名称:

public void synchronized progress(int percent){
    System.out.print('\r');
    String progressText = Thread.currentThread().getName() + ": [" + 
    StringUtils.repeat(">", percent) + StringUtils.repeat("=", 100-percent) + "]";
    System.out.print(progressText);
}

这将确保您的信息相对于彼此保持一致。

答案 1 :(得分:0)

有用于此的ansi转义码。有一个很小的库,可以将它们全部植入。这是一个非常简洁的示例,应该可以让您轻松地查看代码的工作原理。

System.out.println();
System.out.println();
System.out.println();
System.out.println();
for (int i = 0; i <= 100; i++) {
    System.out.print(Ansi.cursorUp(5));

    int v = i;
    if (i % 3 == 0) v *= 100;
    if (i % 10 == 0) v *= 1000;
    if (i % 21 == 0) v *= 1000000;

    System.out.print(Ansi.cursorDown());
    System.out.print(Ansi.eraseLine());
    System.out.printf("\rone %s", v + 5);

    System.out.print(Ansi.cursorDown());
    System.out.print(Ansi.eraseLine());
    System.out.printf("\rtwo %s", v + 1);

    System.out.print(Ansi.cursorDown());
    System.out.print(Ansi.eraseLine());
    System.out.printf("\rthree %s", v + 9);

    System.out.print(Ansi.cursorDown());
    System.out.print(Ansi.eraseLine());
    System.out.printf("\rfour %s", v + 15);

    System.out.print(Ansi.cursorDown());
    System.out.printf("\r");

    Thread.sleep(500);
}

该库的Maven坐标:

<dependency>
  <groupId>com.github.tomas-langer.cli</groupId>
  <artifactId>cli-progress</artifactId>
  <version>1.0.0</version>
</dependency>