面试题–三个线程循环打印ABC10次的几种解决方法-wait/notify(2)
package com.ces.myThread;
public class PrintThreadExample2 implements Runnable {
private String name;
private Object pre;
private Object self;
public PrintThreadExample2(String name, Object pre, Object self) {
this.name = name;
this.pre = pre;
this.self = self;
}
@Override
public void run() {
//循环打印五次ABC
int count = 3;
while (count > 0) {
synchronized (pre) {
synchronized (self) {
System.out.print(name);
count--;
self.notifyAll();
}
try {
pre.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws InterruptedException {
Object a = new Object();
Object b = new Object();
Object c = new Object();
//确保锁的顺序
//当A执行完毕,释放a锁,唤醒等待a的B线程,并且会阻塞等待c这个锁
//B同理
PrintThreadExample2 A = new PrintThreadExample2("A", c, a);
PrintThreadExample2 B = new PrintThreadExample2("B", a, b);
PrintThreadExample2 C = new PrintThreadExample2("C", b, c);
//确保ABC的启动顺序
new Thread(A).start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(B).start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(C).start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}