研究system.out和system.err乱序问题

今天在研究java中输入输出流问题时发现同时使用system.out和system.err会出现乱序问题,

给出代码:

System.out.println("tang");

System.err.println("crazy_Tang");

理想中的结果输出顺序应该是

tang

crazy_Tang

但实际会出现两种情况,如下

 

我们知道,system.out会存在一个输出缓冲区,但system.err不会,但这与上面的情况应该没有什么关系

看样子可能与线程有关,两种输出方式可能是线程不安全的

所以我尝试给这两行代码上锁,但是效果不佳

所以可能是线程冲突+缓冲区共同造成的,所以我改进代码

 效果也不理想,所以我对缓冲区区别这种可能性死心了,至于线程冲突还是有可能

但是我加锁还是解决不了问题,所以先将这个问题放一边,我尝试将两种输出流重定向到文本文件

理想中,Console输出顺序是:

tang

crazy_Tang

文本文件中输出顺序是:

crazyTang

crazy!!

 这时发现文本文件中输出顺序始终是正确的,但System.err打印不出红色

 这给了我警示,可能是两种输出流线程冲突的原因,所以我再改进代码

这样顺序就一直正确了,但还是有问题:

System.err打印不出红色,这个原因我查了一下:

System.err.println只能在屏幕上实现打印,即使你重定向了也一样

(好像在JTextPane上也乐意实现打印)

总结:

system.out和system.err出现乱序问题是因为两种输出流产生线程冲突

解决策略是一种折中策略:

将err输出控制流重定向到System.out,但这样就没办法打出红字(将out输出流重定向到System.err也可)

System.setErr(System.out)

猜你喜欢

转载自www.cnblogs.com/tdw1183710209/p/13199073.html
今日推荐