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 は、コンソール ウィンドウでインターリーブされる 2 つの異なるストリームであり、必ずしも同期されているわけではありません。(気にしないでください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);

2 つのストリームが両方ともコンソールに送られる場合でも、2 つのストリーム間の順序は保証されません。

1回の実行で印刷します(実行ごとに変化します)

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 に答える