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.outOutput by Worker...

使用 System.err

System.outSystem.err 是不同的输出流,它们在不同的时间刷新,因此输出在控制台上是乱序的。

对所有输出行使用 System.out.println(),所有输出都将按预期顺序排列。