3

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

  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
4

2 回答 2

11

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

于 2012-03-29T22:11:39.420 回答
3

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

于 2012-03-29T22:11:29.227 回答