请看这个类,静态方法调用和输出。
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
答案 0 :(得分: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
答案 1 :(得分: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行以红色显示
答案 2 :(得分: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");
}