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().

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悢七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值