1. 程式人生 > 其它 >Java 多執行緒 南北多人過橋

Java 多執行緒 南北多人過橋

技術標籤:java多執行緒java多執行緒

有一個南北走向的橋,南邊有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().