System.out和System.err的并发
2016-04-10 12:03
141 查看
System.out和System.err的并发
最近在开发时发现,同时使用System.out和System.err打印内容,会出现多线程的现象。
代码如下:
public class SystemDemo { public static void main(String[] args) { for (int i = 0; i < 5; i++) { System.out.println("+++++"); // System.out.flush(); System.err.println("-----"); } } }
运行结果类似于:
查阅资料的解释是:
标准输出和标准出错的一个区别是,标准输出往往是带缓存的,而标准出错没有缓存。 但是我们通过添加System.out.flush发现,现象依然存在。 -->
所以不是缓存的原因
另一个解释是,They
are different OutputStreams. 建议的方法:
System.setErr(System.out);
或者
System.setOut(System.err);
发现的确是可以的:
private static void test02() { System.setErr(System.out); // System.setOut(System.err); for (int i = 0; i < 5; i++) { System.out.println("+++++"); System.err.println("-----"); } }
运行结果:
总结:
System.out和System.err使用不同的printstream对象,所以线程不同步。同时使用进行打印,会出现打印内容交叉的结果。
相关文章推荐
- 深入理解 hash 函数、HashMap、LinkedHashMap、TreeMap
- LeetCode *** 38. Count and Say
- recycleView学习01
- KMP算法实现
- 2014年辛星Javascript解读第三节
- 在类中声明函数而不去定义编译通过
- 查找(一)史上最简单清晰的红黑树讲解
- qt实现多平台的二维码展示
- iOS开发数据库篇—FMDB简单介绍
- iOS开发数据库篇—FMDB数据库队列
- 一个合格的程序员应该读过哪些书
- 1289 - LCM from 1 to n
- bfs
- 在fragment中实现仿tab效果
- Html之表单标签
- 结对编程——四则运算
- ssdb binlog机制 存疑
- 分享一个链接
- JnI调用机制
- C++德州扑克的核心规则算法