Javaマシン試験プログラミング問題記録1


タイトル:3つのスレッドIDはそれぞれA、B、Cで、マルチラインプログラミングを実現して、スクリーンの上で循環して10回ABC構想を印刷します:スレッドの通信を利用して標識flagを設置して、flag==1出力A flag==2出力B flag==3出力C countは循環回数を制御して、waitとnotifyAll方法がロックの対象から呼び出すことしかできないことを覚えています
/*
     ID   A、B、C,        ,        10 ABCABC
 */
public class Test1 {

    private static int flag = 1;
    private static int count = 1;

    public synchronized static void runA() {
        while (count <= 10) {
            if (flag == 1) {
                System.out.println("A");
                flag++;
                //      
                Test1.class.notifyAll();
            } else {
                try {
                    Test1.class.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public synchronized static void runB() {
        while (count <= 10) {
            if (flag == 2) {
                System.out.println("B");
                flag++;
                //      
                Test1.class.notifyAll();
            } else {
                try {
                    Test1.class.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public synchronized static void runC() {
        while (count <= 10) {
            if (flag == 3) {
                System.out.println("C");
                flag = 1;
                System.out.println(count++ + " ");
                //      
                Test1.class.notifyAll();
            } else  {
                try {
                    Test1.class.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    static class A extends Thread {
        @Override
        public void run() {
            Thread.currentThread().setName("A");
            runA();
        }
    }

    static class B extends Thread {
        @Override
        public void run() {
            Thread.currentThread().setName("B");
            runB();
        }
    }

    static class C extends Thread {
        @Override
        public void run() {
            Thread.currentThread().setName("C");
            runC();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread.sleep(3000);
        A a = new A();
        B b = new B();
        C c = new C();
        a.start();
        b.start();
        c.start();
    }
}