有一个南北走向的桥,南边有4人,北边有3人,分别让他们到达对面,桥只能容纳一人通过。显示出每个人的过桥状态。
TestBridge.java
class PersonPassBridge extends Thread{
private Bridge bridge;
String id;
public PersonPassBridge(Bridge b,String id) {
bridge=b;
this.id=id;
}
public void run() {
bridge.getBridge();//上桥
System.out.println(id+"正在过桥");
try {
Thread.sleep(1000); //过桥时间
} catch (InterruptedException e) {}
bridge.goDownBridge();//下桥
}
}
class Bridge{
private boolean engaged=false; //false代表桥上没人
public synchronized void getBridge() {//上桥
while(engaged) {
try {
wait(); //当桥上有人就等着
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
engaged=true;
}
public synchronized void goDownBridge() {//下桥
engaged=false;
notifyAll(); //唤醒所有等待
}
}
public class TestBridge {
public static void main(String[] args) {
PersonPassBridge p;
Bridge b=new Bridge();
for(int k=1;k<=4;k++) {
p=new PersonPassBridge(b, "南边"+k+"号");
p.start();
}
for(int k=5;k<=7;k++) {
p=new PersonPassBridge(b, "北边"+k+"号");
p.start();
}
}
}
笔记:
suspend()和resume()方法容易发生死锁,因为调用suspend()时,目标线程会在持有已获得锁的状态停下来,如果此线程需要两个锁才能恢复运行,而它只得到一个,另一个被同样需要双锁的挂起线程锁定,双方僵持就会发生死锁。
所以这两个方法从JDK1.2开始就不再推荐使用,更强调用wait()和notify().