Heim >Java >javaLernprogramm >Warum erzeugen „System.out.println' und „System.err.println' in Java manchmal eine Ausgabe außerhalb der Reihenfolge?

Warum erzeugen „System.out.println' und „System.err.println' in Java manchmal eine Ausgabe außerhalb der Reihenfolge?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-01 02:03:10843Durchsuche

Why Does `System.out.println` and `System.err.println` Sometimes Produce Out-of-Order Output in Java?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn