Out-of-Order-Ausgabe von System.out.println und System.err.println
In Java System.out.println () schreibt in den Standardausgabestream, während System.err.println() in den Standardfehlerstream schreibt. Normalerweise werden diese Streams nacheinander auf der Konsole ausgegeben. Unter bestimmten Umständen ist dieses Verhalten jedoch möglicherweise nicht konsistent.
Bedenken Sie den folgenden Codeausschnitt:
public static void main(String[] args) { for (int i = 0; i < 5; i++) { System.out.println("out"); System.err.println("err"); } }
Wenn Sie dieses Programm ausführen, erzeugt es die folgende Ausgabe:
out out out out out err err err err err
Anstatt zwischen „out“ und „err“ zu wechseln, zeigt die Ausgabe alle „out“-Meldungen gefolgt von allen „err“-Meldungen an. Diese Diskrepanz erklärt sich durch die unterschiedliche Beschaffenheit der Standardausgabe- und Fehlerströme.
Ausgabeströme in Java werden zwischengespeichert, was bedeutet, dass Daten nicht sofort in die Konsole geschrieben werden. Stattdessen wird es in einem internen Puffer gespeichert und regelmäßig geleert. Der Löschvorgang wird durch verschiedene Kriterien ausgelöst, beispielsweise durch einen bestimmten Zeitraum der Inaktivität oder das Erreichen einer bestimmten Größe des Puffers.
Im Fall des obigen Codeausschnitts schreiben sowohl die Standardausgabe als auch die Fehlerströme in ihre jeweiligen Puffer. Da die Schreibvorgänge nicht synchronisiert sind, ist es möglich, dass der Puffer des Fehlerstroms zuerst voll wird und geleert wird, obwohl einige „Out“-Nachrichten noch im Puffer des Ausgabestroms verbleiben. Dies führt zu der beobachteten Ausgabe außerhalb der Reihenfolge.
Um dieses Problem zu beheben, können Sie sicherstellen, dass beide Ausgabestreams nach jedem Schreibvorgang geleert werden. Der folgende Code enthält Aufrufe von System.out.flush() und System.err.flush() innerhalb der Schleife:
public static void main(String[] args) { for (int i = 0; i < 5; i++) { System.out.println("out"); System.out.flush(); System.err.println("err"); System.err.flush(); } }
Mit dieser Änderung wird die Ausgabe in der erwarteten abwechselnden Reihenfolge gedruckt:
out err out err out err out err out err
Das obige ist der detaillierte Inhalt vonWarum erzeugen „System.out.println' und „System.err.println' in Java manchmal eine Ausgabe außerhalb der Reihenfolge?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!