Java 使用 NetBeans 7.2.1 - 执行顺序问题
Java with NetBeans 7.2.1 - Execution order issue
考虑 NetBeans Java 应用程序中的以下两个 classes。主要class:
public class ExcecutionOrder {
public static void main(String[] args) {
Worker worker = new Worker();
worker.init();
worker.doProcessing();
worker.stop();
}
}
还有一个这样的工人class:
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 已停止。)仍然是零散的。受输出消息干扰。
使用 Eclipse 执行相同的操作会得到预期的执行顺序。
有人知道这里发生了什么吗? - 非常感谢提前提出任何建议!
PS:NetBeans 7.2.1 使用的是 jdk1.7.0_03,Eclipse 版本是 Mars.2 Release (4.5.2) - 将代码从worker class 到 main class 的 main 方法,根本不使用 main 方法以外的其他方法。
您的 Worker initialized
使用 System.out
,Output by Worker...
使用 System.err
System.out
和 System.err
是不同的输出流,它们在不同的时间刷新,因此输出在控制台上是乱序的。
对所有输出行使用 System.out.println()
,所有输出都将按预期顺序排列。
考虑 NetBeans Java 应用程序中的以下两个 classes。主要class:
public class ExcecutionOrder {
public static void main(String[] args) {
Worker worker = new Worker();
worker.init();
worker.doProcessing();
worker.stop();
}
}
还有一个这样的工人class:
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 已停止。)仍然是零散的。受输出消息干扰。
使用 Eclipse 执行相同的操作会得到预期的执行顺序。
有人知道这里发生了什么吗? - 非常感谢提前提出任何建议!
PS:NetBeans 7.2.1 使用的是 jdk1.7.0_03,Eclipse 版本是 Mars.2 Release (4.5.2) - 将代码从worker class 到 main class 的 main 方法,根本不使用 main 方法以外的其他方法。
您的 Worker initialized
使用 System.out
,Output by Worker...
System.err
System.out
和 System.err
是不同的输出流,它们在不同的时间刷新,因此输出在控制台上是乱序的。
对所有输出行使用 System.out.println()
,所有输出都将按预期顺序排列。