1. 程式人生 > >編寫一個程式,啟動三個執行緒,三個執行緒的名稱分別是 A,B,C; 每個執行緒將自己的名稱在螢幕上列印5遍,列印順序是ABCABC...

編寫一個程式,啟動三個執行緒,三個執行緒的名稱分別是 A,B,C; 每個執行緒將自己的名稱在螢幕上列印5遍,列印順序是ABCABC...

  • 設定標誌位flag
  • 當flag==1時,列印A
  • 當flag==2時,列印B
  • 當flag==3時,列印C
  • 用count控制列印的次數,題目要求列印5遍,即15個字元
  • 這裡的用notifyAll()的原因:是要把其餘兩個全都喚醒,因為如果用notify(),它是二選一喚醒,不確定它是否會喚醒我們所需要的
  • run()方法裡的程式碼是判斷確定列印某個字元,即:當與執行緒名稱一樣時,則列印
class Print {
    private int flag = 1;
    private int count = 0;

    public int getCount() {
        return count;
    }

    public synchronized void printA() {
        while (flag != 1) { //不為1,所以列印A的執行緒等待
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(Thread.currentThread().getName());
        count++;
        flag = 2;
        notifyAll();
    }
    public synchronized void printB() {
        while (flag != 2) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(Thread.currentThread().getName());
        flag = 3;
        count++;
        notifyAll();
    }
    public synchronized void printC() {
        while (flag != 3) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(Thread.currentThread().getName());
        flag = 1;
        count++;
        notifyAll();
    }
}

class MyThread implements Runnable {
    private Print print;

    public MyThread(Print print) {
        this.print = print;
    }

    @Override
    public void run() {
        while (print.getCount() < 16) {
            if (Thread.currentThread().getName().equals("A")) {
                print.printA();
            } else if (Thread.currentThread().getName().equals("B")) {
                print.printB();
            } else if (Thread.currentThread().getName().equals("C")) {
                print.printC();
            }
        }
    }
}



public class Test {
    public static void main(String[] args) {
        Print print = new Print();
        MyThread myThread = new MyThread(print);
        Thread thread1 = new Thread(myThread,"A");
        Thread thread2 = new Thread(myThread,"B");
        Thread thread3 = new Thread(myThread,"C");
        thread1.start();
        thread2.start();
        thread3.start();
    }
}