java – 使用System.out.print vs println的多线程问题

前端之家收集整理的这篇文章主要介绍了java – 使用System.out.print vs println的多线程问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下线程,每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();

解决方案:问题与netbeans有关.当我从java -jar中将它作为jar文件运行时,它工作正常.

这是我一生中见过的最令人沮丧的错误之一.当我尝试在调试模式下使用断点运行此代码时,一切正常.

解决方法

stdout是行缓冲的. 使用stderr,或在每次打印后刷新PrintStream.

猜你在找的Java相关文章