JAvaマルチスレッド:循環出力ABC


JAvaマルチスレッドの古典的な問題:問題:A,B,Cの3つのスレッドがあり、Aスレッド出力A,Bスレッド出力B,Cスレッド出力Cがあり、要求は同時に3つのスレッドを起動し、ABCを順番に出力し、10回循環する.
まずテストクラスを書き出します
public class Main { 
    public static void main(String[] args) throws Exception{
        Object a=new Object();
        Object b=new Object();
        Object c=new Object();

        Mythread my1=new Mythread("A",c,a);
        Mythread my2=new Mythread("B",a,b);
        Mythread my3=new Mythread("C",b,c);

        Thread thread1=new Thread(my1);
        Thread thread2=new Thread(my2);
        Thread thread3=new Thread(my3);

        thread1.start();
        Thread.sleep(1000);
        thread2.start();
        Thread.sleep(1000);
        thread3.start();
        Thread.sleep(1000);
    }
}

ここで、a,b,cは、それぞれ3つのスレッドに対応するオブジェクトを表す.Runnableインタフェースを実装するクラスを書き換える
public class Mythread implements Runnable{
    private String name="";
    private Object pre;//         
    private Object now;//        
    public Mythread(String name,Object pre,Object now){
        this.name=name;
        this.pre=pre;
        this.now=now;
    }
    @Override
    public void run(){
        int count=10;
        while(count>0){
            count--;
            synchronized(pre){
                synchronized(now){
                        System.out.println(name);
                        now.notify();//       
                }
                try {
                        pre.wait();
                } catch (InterruptedException e) {
                        e.printStackTrace();
                }
            }
        }
    }
}

結果;ABCABCABCABCABCABCABCABCABCABC
結果分析:3つのオブジェクトa b c 1がある.まず、スレッド1が実行終了後、a.notify()が実行されてスレッド2が起動し、c.wait()が実行されてスレッド1が待機しているため、whileは1回しか実行されず、誰かがcを起動してから実行を継続する必要がある.2.その後、スレッド2が起動されたため、b.notify()が実行され、スレッド3が起動され、a.wait()が実行されてスレッド2が待機しているため、whileは1回しか実行されず、誰かがaを起動してから実行を継続する必要がある.3..その後、スレッド3が起動されたため、c.notify()が実行され、スレッド1が起動され、b.wait()が実行され、スレッド3が待機しているため、whileは1回しか実行されず、誰かがbを起動してから実行を継続する必要がある.なお、スレッド1ではc.wait()が実行されているが、スレッド1が待機状態となり、waitがオブジェクトロックを解放することにより、スレッド3においてcのオブジェクトロック(文:synchronized(now))が得られる.