ホームページ > Java > &#&チュートリアル > Java で「System.out.println」と「System.err.println」が順序どおりでない出力を生成することがあるのはなぜですか?

Java で「System.out.println」と「System.err.println」が順序どおりでない出力を生成することがあるのはなぜですか?

Patricia Arquette
リリース: 2025-01-01 02:03:10
オリジナル
794 人が閲覧しました

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

System.out.println および System.err.println からの順序外の出力

Java の場合、System.out.println () は標準出力ストリームに書き込みますが、System.err.println() は標準エラー ストリームに書き込みます。通常、これらのストリームはコンソールに順番に出力されます。ただし、特定の状況下では、この動作は一貫していない可能性があります。

次のコード スニペットを考えてみましょう:

このプログラムを実行すると、次の出力が生成されます:

「out」と「err」を交互に繰り返す代わりに、出力にはすべての「out」メッセージが表示され、その後にすべての「err」メッセージが表示されます。この不一致は、標準出力ストリームとエラー ストリームの性質の違いによって説明されます。

Java の出力ストリームはキャッシュされます。つまり、データはすぐにはコンソールに書き込まれません。代わりに、内部バッファに保存され、定期的にフラッシュされます。フラッシュ プロセスは、一定期間の非アクティブ状態やバッファが特定のサイズに達した場合など、さまざまな基準によってトリガーされます。

上記のコード スニペットの場合、標準出力ストリームとエラー ストリームの両方がそれぞれのストリームに書き込まれます。バッファー。書き込みは同期されていないため、出力ストリームのバッファーに一部の「出力」メッセージが残っている場合でも、エラー ストリームのバッファーが最初にいっぱいになり、フラッシュされる可能性があります。この結果、出力の順序が乱れることが確認されます。

この問題を解決するには、書き込みのたびに両方の出力ストリームが確実にフラッシュされるようにします。次のコードには、ループ内に System.out.flush() と System.err.flush() の呼び出しが含まれています:

この変更により、出力は予期された交互の順序で出力されます:

以上がJava で「System.out.println」と「System.err.println」が順序どおりでない出力を生成することがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート