编写一个程序,启动三个线程,三个线程的名称分别是 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();
    }
}

猜你喜欢

转载自blog.csdn.net/WZL995/article/details/84205443