我有以下线程,每200ms只打印一个点:
public class Progress { private static boolean threadCanRun = true; private static Thread progressThread = new Thread(new Runnable() { public void run() { while (threadCanRun) { System.out.print('.'); System.out.flush(); try { progressThread.sleep(200); } catch (InterruptedException ex) {} } } }); public static void stop() { threadCanRun = false; progressThread.interrupt(); } public static void start() { if (!progressThread.isAlive()) { progressThread.start(); } else { threadCanRun = true; } } }
我用这段代码启动线程(现在):
System.out.println("Working."); Progress.start(); try { Thread.sleep(10000); //To be replaced with code that does work. } catch (InterruptedException ex) {} Progress.stop();
这有什么奇怪的:
如果我使用System.out.println(‘.’);,代码完全按预期工作. (除了我每次都不想要新线路的事实).
使用System.out.print(‘.’);,代码等待十秒钟,然后显示输出.
的System.out.println:
06002
是System.out.print:
06003
发生了什么,我该怎么做才能绕过这种行为?
编辑:
我也试过这个:
private static synchronized void printDot() { System.err.print('.'); }
和printDot()而不是System.out.print(‘.’);
它仍然无法正常工作.
EDIT2:
有趣.此代码按预期工作:
System.out.print('.'); System.out.flush(); //Makes no difference with or without System.out.println();
这不是:
System.err.print('.'); System.err.flush(); System.out.print('.'); System.out.flush();
解决方法
stdout是行缓冲的. 使用stderr,或在每次打印后刷新PrintStream.