2012-03-29 14 views
3

誰でもこのループを実行した後にいつもこの奇妙な出力が表示されるのか教えていただけますか?これはスレッドの問題か何ですか?ループ実行時に奇妙な出力が発生する

for(int i=0;i<10;i++){ 
    System.out.println("out: "+i); 
    System.err.println("err: "+(i+1)); 
    } 

- > OUTPUT:

err: 1 
    out: 0 
    err: 2 
    err: 3 
    err: 4 
    out: 1 
    out: 2 
    out: 3 
    out: 4 
    err: 5 
    out: 5 
    err: 6 
    out: 6 
    err: 7 
    err: 8 
    out: 7 

    out: 8 
    err: 9 
    out: 9 
    err: 10 
    out: 10 

答えて

11

端末ではアプリケーションが実行されており、2つのファイル記述子(stdout用とstderr用)が接続されています。次に、アプリケーションがこれらのファイル記述子で出力しているデータを読み込み、画面上にレンダリングする必要があります。端末アプリケーション(またはそれに関するOS)がこの相互作用をどのように実装するかは保証されていません。端末が実際にstdoutとstderrから2つのスレッドを並列に読み込んでいるとします。これらの2つのスレッドがfdsから画面にデータを取得する順序は、アプリが出力する順番になるとは限りません。

+0

これは興味深いです。私はこれが間違っていると思ったので、最初は下落した。 Javaが 'System.out'をバッファしていて、' System.err'がバッファされていなかったという私の前提でした。しかし、私がコマンドラインからクラスを実行すると、私は ''私たちは完全にインターリーブされています。つまり、何か異なることをしているのはアプリケーションです。魅力的なありがとう@MK。 +1 – Gray

+0

@GrayあなたはSystem.errがバッファリングされていないと思いますが、これらは相互排他的ではないと思います。私はこれらがインターリーブする理由について一般的な感情を与えようとしていました。また、私は\ n印刷がフラッシングを引き起こすかもしれないと思いますか?その場合、stdoutとstderrの動作は同じになります。 –

+0

私のコメントはあなたに同意していませんでした。私は全く同意します。デフォルトでは、PrintStreamは '\ n'が見えるときにはフラッシュされません。 'System.out'と' System.err'がどのように設定されているのかよく分かりません。 – Gray

3

標準出力と標準エラー出力は、別々のバッファを持っています。インターリーブは正常です。各印刷呼び出し後に出力ストリームflushingを試してください。

関連する問題