考虑一个NetBeans Java应用以下两类。主类:
public class ExcecutionOrder {
public static void main(String[] args) {
Worker worker = new Worker();
worker.init();
worker.doProcessing();
worker.stop();
}
}
和工人阶级是这样的:
public class Worker {
public void init() {
System.out.println("\n-------------------------------------------------");
System.out.println("Worker initialized.");
System.out.println("-------------------------------------------------\n");
}
public void doProcessing() {
printNTimes(2000);
}
public void doProcess(int n) {
printNTimes(n);
}
public void printNTimes(int n) {
System.out.println();
for (int i = 0; i < n; i++) {
System.err.println("Output by Worker: " + i);
}
System.out.println();
}
public void stop() {
System.out.println("\n-------------------------------------------------");
System.out.println("Worker stopped.");
System.out.println("-------------------------------------------------\n");
}
}
奇怪的是,输出结果的顺序如下:
Output from Worker: 0
-------------------------------------------------
Output from Worker: 1
Worker initialized.
Output from Worker: 2
-------------------------------------------------
Output from Worker: 3
[...]
它应该是:
-------------------------------------------------
Worker initialized.
-------------------------------------------------
Output from Worker: 0
Output from Worker: 1
Output from Worker: 3
[...]
如果设置的netbeans的处理器亲和性只使用一个CPU核心,那么至少初始部分是细而另一个控制研究消息(工人停止。)仍是零散RESP。通过输出消息的干扰。
否则使用Eclipse导致预期的执行顺序是一样的。
有没有人一个想法,这里发生了什么? - 非常感谢任何建议提前!
PS:的NetBeans 7.2.1使用jdk1.7.0_03,Eclipse版本是Mars.2推出(4.5.2) - 甚至从工人类到主类的主要方法,而无需使用其它方法移动代码时出现的问题比的主要方法都没有。
您正在使用System.out
您Worker initialized
和System.err
您Output by Worker...
System.out
和System.err
是不同的输出流,它们在不同的时间冲洗,因此输出是不按顺序对控制台。
使用System.out.println()
您的所有输出线,所有的输出将是所期待的顺序。