0

以下のコードでは、以下のように、黒と赤の番号プリンターを期待どおりに作成する方法を教えてください。

  • 1(黒)
    1(赤)
    2(黒)
    2(赤)

それが実際に行うこととは対照的に(エラーストリームまたは出力ストリームが利用可能かどうかに応じて、ランダムな順序があります):

  • 1(黒)
    2(黒)
    1(赤)
    2(赤)

コード:

    package threads;

    public class CThread implements Runnable

{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        for (int i = 0; i < 20; i++) {
        outt(i);
        err(i);
        }

    }

    synchronized public void outt(int i){
        System.out.println(i);
    }
    synchronized public void err(int i){
        System.err.println(i);
    }

    public static void main(String [] org){
        Thread th = new Thread(new CThread());
        th.start();
    }


}
4

2 に答える 2

0

出力とエラー用の ArrayList を作成します。System.out と System.err の代わりに、そのリストに追加します。次に、いつ印刷するかを決定し、最初に空の出力リストを印刷し、印刷してエラーリストを空にします。を同期する必要があります。また、印刷の開始後に発生する新しい出力とエラーは、もちろんソートされません。これは、System.out と System.err への出力がコンソールで先着順でマージされるため、解決できません。これを解決したい場合は、プログラムが終了するまで待ってから、すべての出力とすべてのエラーを出力してください。

于 2013-11-08T07:10:04.670 に答える