2016-04-21 6 views
-2

Betrachten Sie die folgenden zwei Klassen in einer NetBeans Java-Anwendung. Die Hauptklasse:Java mit NetBeans 7.2.1 - Ausführungsreihenfolge Ausgabe

public class ExcecutionOrder { 
    public static void main(String[] args) { 

     Worker worker = new Worker(); 

     worker.init(); 
     worker.doProcessing(); 
     worker.stop(); 
    } 
} 

Und ein Arbeiter Klasse wie folgt:

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"); 
    } 
} 

die ouput Ergebnisse in der folgenden Reihenfolge Merkwürdigerweise:

Output from Worker: 0 
------------------------------------------------- 
Output from Worker: 1 
Worker initialized. 
Output from Worker: 2 
------------------------------------------------- 
Output from Worker: 3 
[...] 

wo es sein sollte:

------------------------------------------------- 
Worker initialized. 
------------------------------------------------- 
Output from Worker: 0 
Output from Worker: 1 
Output from Worker: 3 
[...] 

Wenn ich den Prozessor einstellen Affinität von Netbeans zur Verwendung nur eines CPU-Kerns, dann ist zumindest der Anfangsteil in Ordnung und die andere Kontrollmeldung (Worker gestoppt.) ist noch fragmentiert resp. interferiert durch Ausgabenachrichten.

Das gleiche Ergebnis mit Eclipse führt zu der erwarteten Ausführungsreihenfolge.

Hat jemand eine Idee, was hier passiert? - Vielen Dank für eine Beratung im Voraus!

PS: NetBeans 7.2.1 verwendet jdk1.7.0_03, Eclipse-Version ist Mars.2 Release (4.5.2) - Das Problem tritt sogar auf, wenn der Code von der Worker-Klasse zur Hauptmethode der Hauptklasse verschoben wird ohne andere Methoden als die Hauptmethode überhaupt zu verwenden.

+0

Mit NetBeans IDE 7.4 mit jdk1.8.0_05 liefert auch eine Ausführungsreihenfolge wie erwartet. –

+0

Überprüfen Sie meine Antwort – haifzhan

Antwort

0

Du System.out für Ihre Worker initialized und System.err für Ihre Output by Worker...

System.out und System.err sind verschiedene Ausgangsströme verwenden, werden sie zu unterschiedlichen Zeiten gespült, also in der falschen Reihenfolge auf der Konsole ist der Ausgang.

Verwenden Sie System.out.println() für alle Ihre Ausgangsleitungen, alle Ausgänge würden in der erwarteten Reihenfolge sein.

+0

Vielen Dank für Ihr Feedback! Ich werde das am Montag ausprobieren und Ihnen Feedback geben. –

+0

Sie hatten Recht. Das Ändern aller Ausgaben nach System.out.println() löste das Problem. Vielen Dank! :-) –