我只是编写一种方法来在控制台中打印进度条。它可以像这样打印:
[>>>>>>>>>>>>>>>>>>>> ====== ===============================]
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中的进度线。
有可能吗?
答案 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>