Java 多執行緒 南北多人過橋
阿新 • • 發佈:2021-02-20
有一個南北走向的橋,南邊有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().