`
一路欢笑一路走
  • 浏览: 11080 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

哲学家就餐问题

阅读更多

哲学家就餐问题

  

   筷子类

   

//筷子类
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
吃饭
放下筷子

 

分享到:
评论

相关推荐

    c语言实现哲学家就餐问题

    文档为实验报告,运行环境是ubantu,文档包含哲学家就餐问题的代码,使用三种方法解决哲学家就餐问题,顺序资源法,加房间法和P_sim法,希望对大家有帮助

    java哲学家就餐问题

    java编写的哲学家就餐问题的解决方案,有图形界面,我是重庆大学的。如果你也是重庆大学的,那就请毫不犹豫的下载吧,肯定是你需要的代码,信号量

    java解哲学家就餐问题

    java解哲学家就餐问题 哲学家进餐问题是一个多线程运用的经典例子,涉及到线程同步/互斥,临界区访问问题以及一个避免死锁的解决方法。 有五个哲学家绕着圆桌坐,每个哲学家面前有一盘面,两人之间有一支筷子,...

    哲学家进餐问题的C语言实现

    这是一个描叙哲学家进餐问题的代码。。。。。。C语言写额

    6个哲学家就餐问题原代码

    经典的哲学家就餐问题,这里是6个哲学家就餐,用p,v原语实现避免死锁,linux下运行

    操作系统:哲学家进餐问题(p,v操作实现互斥与同步)

    分析哲学家进餐问题,p,v操作实现互斥与同步,分析记录性信号量的不足,并指出给改进方法 方法一:最多允许4人同时进餐; 方法二:分奇偶数进餐,以及AND型信号量解决该问题。 (免费下载,无需积分)

    哲学家进餐问题

    哲学家进餐问题

    哲学家进餐问题的代码

    有三个.cpp文件,代码是我亲手写的,都可以运行,这个代码包含有3种方式避免死锁的方法,一个是允许四个哲学家同时进餐,第二个是一下子就拿两根筷子,否则不拿,第三个就是奇数哲学家先拿左边的筷子,偶数哲学家拿...

    信号量同步实验报告(哲学家进餐问题避免死锁的三种方法)

    操作系统初学,关于信号量同步的实验报告,用三种方法避免哲学家进餐问题死锁,a:and信号量,b:控制进餐人数,c设置条件

    哲学家就餐问题算法分析与代码

    哲学家就餐问题的分析与代码,供大家参考吧,很详细

    哲学家就餐问题源程序

    关于5个哲学家就餐线程同步问题的解决方法 此方法对左右手刀叉实行控制,防止了死锁,实现了线程的同步 注意5个以上的哲学家亦可用此方法解决

    java实现哲学家进餐问题

    有五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。 在圆桌上有五个碗和五把叉子,平时...哲学家进餐问题可看作是并发进程并发执行时处理共享资源的一个有代表性的问题。

    C#哲学家就餐问题

    使用了C#对哲学家就餐问题进行了仿真,采用进程交互法,并使用批均值法、重复删除法对仿真数据进行了分析

    哲学家就餐问题与死锁

    死锁是进程并发执行过程中可能出现的现象,哲学家就餐问题是描述死锁的经典例子。假设有几位哲学家围坐在一张餐桌旁,桌上有吃不尽的食品,每两位哲学家之间摆放着一根筷子,筷子的个数与哲学家的数量相等,每一位...

    操作系统 哲学家进餐问题 实现 1 输入饥饿哲学家 2 停止就餐 3 显示个哲学家的状态

    用c++实现哲学家进餐问题 哲学家i思考中 1 输入饥饿哲学家 2 停止就餐 3 显示个哲学家的状态 "饥饿哲学家的数目 各饥饿哲学家的编号 输入释放筷子的哲学家编号

    操作系统实验报告(哲学家就餐问题、读者写入者问题)

    有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子每个哲学家的行为是思考,感到饥饿,然后吃通心粉.为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从...

    JAVA实现哲学家就餐问题

    JAVA实现哲学家就餐问题

Global site tag (gtag.js) - Google Analytics