【问题标题】:Strange output when running a loop运行循环时出现奇怪的输出
【发布时间】:2012-04-13 15:01:47
【问题描述】:

谁能告诉我为什么我在运行这个循环后总是有这个奇怪的输出?这是线程问题还是什么?

  for(int i=0;i<10;i++){
     System.out.println("out: "+i);
     System.err.println("err: "+(i+1));
   }

->输出:

    err: 1
    out: 0
    err: 2
    err: 3
    err: 4
    out: 1
    out: 2
    out: 3
    out: 4
    err: 5
    out: 5
    err: 6
    out: 6
    err: 7
    err: 8
    out: 7

    out: 8
    err: 9
    out: 9
    err: 10
    out: 10

【问题讨论】:

    标签: java multithreading java-io system.out


    【解决方案1】:

    您的终端正在运行您的应用程序,并连接了两个文件描述符,一个用于 stdout,一个用于 stderr。然后它必须读取应用程序在这些文件描述符上输出的数据并将其呈现在屏幕上。无法保证终端应用程序(或操作系统)如何实现这种交互。想象一下,终端实际上​​有 2 个线程从 stdout 和 stderr 并行读取。这 2 个线程从 fds 获取数据并显示在屏幕上的顺序不能保证与您的应用输出时的顺序一致。

    【讨论】:

    • 这很有趣。我最初投了反对票,因为我认为这是错误的。我假设 Java 正在缓冲 System.outSystem.err 没有被缓冲。但是如果我从命令行运行一个类,我会看到"oeoeoeoeoeoeoeoeoe" 完美交错。这意味着它是应用程序在做不同的事情。迷人。谢谢@MK。 +1
    • @Gray 我认为 System.err 没有缓冲是对的,但我不认为这些是相互排斥的。我试图给出一个关于为什么这些会交错的一般感觉。另外我认为打印 \n 可能会导致冲洗?在这种情况下,stdout 和 stderr 的行为将是相同的。
    • 我的评论并不反对你。我完全同意。默认情况下,PrintStream 在看到“\n”时不会刷新。我不确定System.outSystem.err 是如何配置的。
    【解决方案2】:

    标准输出和标准错误有单独的缓冲区。交错是正常的。在每次打印调用后尝试flushing 输出流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 2015-03-15
      • 1970-01-01
      • 2016-03-07
      • 2018-03-15
      • 1970-01-01
      • 2012-06-20
      相关资源
      最近更新 更多