System.out和System.err的并发

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("-----");
        }
    }
}

运行结果类似于: 

查阅资料的解释是:

  1. 标准输出和标准出错的一个区别是,标准输出往往是带缓存的,而标准出错没有缓存。 但是我们通过添加System.out.flush发现,现象依然存在。 --> 所以不是缓存的原因

  2. 另一个解释是,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对象,所以线程不同步。同时使用进行打印,会出现打印内容交叉的结果。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值