哲学家就餐问题

哲学家就餐问题

  

   筷子类

   

//筷子类
public class Chopstick {

	public String name;

	// 是否可用
	boolean isAvailable;

	public Chopstick(String name) {
		this.name = name;
		isAvailable = true;
	}

	// 拿起筷子
	public synchronized void takeChopstick() {
		while (!isAvailable) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		isAvailable = false;
	}

	//放下筷子
	public synchronized void dropChopstick() {
		isAvailable = true;
		notify();
	}

}

 

   哲学家类

   

public class Philosoper extends Thread{
	// 哲学家名字
	private String name;
	private Chopstick leftStick;
	private Chopstick rightStick;
	public Philosoper(String name, Chopstick leftStick, Chopstick rightStick) {
		this.name = name;
		this.leftStick = leftStick;
		this.rightStick = rightStick;
	}
	@Override
	public void run() {
		leftStick.takeChopstick();
		System.out.println(name+"拿起了左边的筷子"+leftStick.name);
		rightStick.takeChopstick();
		System.out.println(name+"拿起了右边的筷子"+rightStick.name);
		System.out.println("吃饭");
		leftStick.dropChopstick();
		rightStick.dropChopstick();
		System.out.println("放下筷子");
	}
}

 

   测试类

    

public static void main(String[] args) {
		// 定义三只筷子
		Chopstick stick1 = new Chopstick("筷子1");
		Chopstick stick2 = new Chopstick("筷子2");
		Chopstick stick3 = new Chopstick("筷子3");
		// 定义三个哲学家
		Thread thread1 = new Philosoper("哲学家1", stick1, stick2);
		Thread thread2 = new Philosoper("哲学家2", stick2, stick3);
		Thread thread3 = new Philosoper("哲学家3", stick3, stick1);

		thread1.start();
		thread2.start();
		thread3.start();
	}

 

   结果

   

哲学家1拿起了左边的筷子筷子1
哲学家2拿起了左边的筷子筷子2
哲学家3拿起了右边的筷子筷子3

 

    一直处于这个状态,每个人都没法用餐,都在等待对方放下筷子,这就是所谓的死锁。

   解决死锁办法:

   将其中的一个哲学家的左右筷子颠倒一下:

   哲学家3把筷子1作为左边筷子,筷子3作为右边筷子,这样当哲学家先拿起筷子1时,发现已经被拿起,就等待,然后哲学家1就能拿起筷子3开始用餐,死锁解决。

 

  解决方法:

  

public static void main(String[] args) {
		// 定义三只筷子
		Chopstick stick1 = new Chopstick("筷子1");
		Chopstick stick2 = new Chopstick("筷子2");
		Chopstick stick3 = new Chopstick("筷子3");
		// 定义三个哲学家
		Thread thread1 = new Philosoper("哲学家1", stick1, stick2);
		Thread thread2 = new Philosoper("哲学家2", stick2, stick3);
		Thread thread3 = new Philosoper("哲学家3", stick1 stick3;

		thread1.start();
		thread2.start();
		thread3.start();
	}

 

  结果

  

哲学家1拿起了左边的筷子筷子1
哲学家2拿起了左边的筷子筷子2
哲学家2拿起了右边的筷子筷子3
吃饭
放下筷子
哲学家1拿起了右边的筷子筷子2
吃饭
放下筷子
哲学家3拿起了左边的筷子筷子1
哲学家3拿起了右边的筷子筷子3
吃饭
放下筷子

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值