`
一路欢笑一路走
  • 浏览: 11595 次
  • 性别: 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
吃饭
放下筷子

 

分享到:
评论

相关推荐

    java哲学家就餐问题

    Java哲学家就餐问题是一个经典的多线程同步问题,源自计算机科学家Dijkstra提出的一个思想实验。在该问题中,五个哲学家围坐在一张圆桌旁,每人面前有一根筷子。他们交替进行思考和吃饭,但必须拿到左右两边的两根...

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

    ### c语言实现哲学家就餐问题 #### 实验背景与目的 **哲学家就餐问题**是计算机科学中的一个经典问题,通常用于演示并发控制中的死锁现象。这个问题涉及到五个哲学家和五个放在他们之间的筷子(或者叉子),每个...

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

    《6个哲学家就餐问题原代码》 哲学家就餐问题是多线程编程中经典的一个死锁问题,它展示了并发操作中可能出现的资源竞争与死锁现象。在这个问题中,我们有6位哲学家围坐在一张圆桌旁,每位哲学家需要两支筷子才能...

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

    哲学家进餐问题(Dining Philosophers Problem)是计算机科学中的一个经典同步问题,由艾兹格·迪杰斯特拉在1965年提出。它以五个正在进餐的哲学家为背景,每个哲学家都有两个习惯:思考和吃饭。在餐桌上有五根筷子...

    哲学家就餐问题源程序

    哲学家就餐问题是一个经典的多线程同步问题,源自计算机科学中的并发控制理论。该问题由Edsger Dijkstra提出,用以模拟五个哲学家在餐桌上的就餐行为:他们每个人都有两只手,一只用来拿筷子(或刀叉),而餐桌上有...

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

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

    哲学家进餐问题多线程演示代码.zip

    《哲学家进餐问题与C/C++多线程同步实践》 在计算机科学领域,多线程编程是一项关键技能,特别是在解决并发问题时。这里我们关注的是一个经典的并发问题——哲学家进餐问题(Dining Philosophers Problem)。该问题...

    哲学家进餐问题

    哲学家进餐问题

    哲学家进餐问题的代码

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

    C#哲学家就餐问题

    《C#实现哲学家就餐问题详解》 哲学家就餐问题是计算机科学中经典的多线程并发问题,由Edsger W. Dijkstra在1965年提出,旨在模拟多个哲学家在同一时间吃饭的情景,避免他们因筷子争夺而无法进食。在本案例中,我们...

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

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

    哲学家进餐问题,操作系统

    "哲学家进餐问题,操作系统" 哲学家进餐问题是计算机科学中的一种经典问题,它是由美国计算机科学家Edsger Dijkstra在1965年提出的。该问题模拟了五位哲学家围坐在圆桌旁,每人面前有一筷子,哲学家们需要拿起左右...

    JAVA实现哲学家就餐问题

    哲学家就餐问题是多线程编程中的一个经典示例,它由计算机科学家Edsger Dijkstra提出,用于模拟并发环境中可能出现的死锁问题。在该问题中,五个哲学家围坐在一张圆桌旁,每个人面前有一根筷子。当哲学家想要吃饭时...

    µCOS-II 信号量试验——哲学家就餐问题

    µCOS-II 信号量试验——哲学家就餐问题 本实验报告旨在介绍µCOS-II操作系统下的信号量试验,通过经典的哲学家就餐问题实验,了解如何利用信号量来对共享资源进行互斥访问。 一、信号量概述 在µCOS-II操作系统...

    哲学家就餐问题(整理)

    ### 哲学家就餐问题详解 #### 一、问题背景及定义 哲学家就餐问题是并发控制领域中的一个经典问题,最初由艾兹格·迪杰斯特拉(Edsger Dijkstra)提出。该问题通常用来阐述同步算法的概念,并且经常被用于测试各种...

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

    操作系统中的“哲学家进餐问题”是一个经典的同步问题,它由计算机科学家Edsger Dijkstra在1965年提出,用于模拟并发进程的竞争条件。在这个问题中,五位哲学家围坐在一张圆桌旁,每人面前有一根筷子。他们交替地...

Global site tag (gtag.js) - Google Analytics