java – 使用System.out.print vs println的多线程问题
发布时间:2020-12-14 06:00:43 所属栏目:Java 来源:网络整理
导读:我有以下线程,每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('.'); Sys
我有以下线程,每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:
是System.out.print:
发生了什么,我该怎么做才能绕过这种行为? 编辑: 我也试过这个: 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.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |