4

请看这个类,静态方法调用和输出。

public class OneThreadManyStaticCalls {

public static final Calculator calculator = new Calculator();
    public static void main(String[] args) {
        dummy(0, 1, 1);
        dummy(0, 2, 2);
        dummy(0, 3, 5);
        dummy(0, 4, 44);
        dummy(0, 5, 5);
    }

    public static void dummy(int a, int b, int expected) {

        System.out.print(System.currentTimeMillis() + "\t");
        if (calculator.add(a, b) == expected) {
            System.out.println("OK");
        } else {
            System.err.println("NOK");
        }
    }
}

我得到了运行这个程序的不同(来自 System.out.print 的订单)输出。例子:

   NOK
   NOK
   1342527389506    OK
   1342527389506    OK
   1342527389506    1342527389506   1342527389506   OK

你们谁能解释我(详细)为什么?提前致谢。sznury

4

3 回答 3

12

System.err 和 System.out 是两个不同的流,它们在您的控制台窗口中交错 - 它们不一定是同步的。尝试使用System.*.flush()(没关系,这似乎不起作用)强制处理输出,或将所有输出打印到同一流。

public static void dummy(int a, int b, int expected) {
    System.out.print(System.currentTimeMillis() + "\t");
    if ((a + b) == expected) { // I don't have your Calculator :<
        System.out.println("OK");
    } else {
        System.out.println("NOK");
    }
}

给出这个结果

1342528255764   OK
1342528255764   OK
1342528255764   NOK
1342528255764   NOK
1342528255764   OK
于 2012-07-17T12:29:51.560 回答
2

一个更简单的例子是

for (int i = 0; i <= 20; i++)
    (i % 2 == 0 ? System.out : System.err).println(i);

即使它们都进入控制台,也不能保证两个流之间的顺序。

一次运行打印(每次运行更改)

1
0
3
2
5
4
7
6
9
8
11
10
13
12
15
14
17
16
19
18
20

注意:在我的 IDE 中,System.err 行显示为红色

于 2012-07-17T12:42:41.073 回答
1

@Jacob Raihle 正确表明这是将您的 system.err 调用更改为 system.out

public static void dummy(int a, int b, int expected) {
    System.out.print(a+" "+b+" = "+expected);
    if((a+b)==expected) 
        System.out.println(" OK");
    else 
        System.out.println(" NOK");

}
于 2012-07-17T12:36:04.583 回答