在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核心,那么至少初始部分是正常的,而另一个控制消息(Worker停止。)仍然是碎片resp。被输出消息干扰。
使用Eclipse执行相同操作会产生预期的执行顺序。
有谁知道这里发生了什么? - 非常感谢您提前提出任何建议!
PS:NetBeans 7.2.1正在使用jdk1.7.0_03,Eclipse版本是Mars.2发行版(4.5.2) - 在将代码从工作类转移到主类的主方法时甚至出现了问题使用除主要方法之外的其他方法。
答案 0 :(得分:1)
您System.out
使用Worker initialized
,System.err
使用Output by Worker...
System.out
和System.err
是不同的输出流,它们在不同的时间刷新,因此输出在控制台上无序。
对所有输出行使用System.out.println()
,所有输出都按预期顺序排列。