版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/StillOnMyWay/article/details/76652659
经典面试题: 三个线程循环打印出ABC各10次。 每个对象需要同时持有前一个对象的锁和自身的锁才可以打印,然后唤醒持有自己锁的下一个对象,再释放前一个对象的锁和执行权。
更详细的说明参考:http://www.cnblogs.com/GarfieldEr007/p/5746362.html (搞懂这个要花点小时间)
import java.lang.Thread;
import java.lang.Runnable;
class ThreadDemo implements Runnable{
private String name;
private Object pre; //前一个对象锁
private Object self; //自身对象锁
ThreadDemo (String name, Object pre, Object self) {
this.name = name;
this.pre = pre;
this.self = self;
}
public void run () {
int num = 10;
while(num > 0 ) {
synchronized (pre) {
synchronized (self) {
System.out.print(name);
num--;
self.notify();
}
try{
pre.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Object a = new Object();
Object b = new Object();
Object c = new Object();
ThreadDemo r1 = new ThreadDemo("A", c, a);
ThreadDemo r2 = new ThreadDemo("B", a, b);
ThreadDemo r3 = new ThreadDemo("C", b, c);
Thread td1 = new Thread(r1);
Thread td2 = new Thread(r2);
Thread td3 = new Thread(r3);
td1.start();
try {Thread.sleep(100);} catch (Exception e) {}
td2.start();
try {Thread.sleep(100);} catch (Exception e) {}
td3.start();
}
}