关键词:
问题描述:
设有5个哲学家,共享一张放有5把椅子的桌子,每人分得一把椅子,但是,桌子上共有5只筷子,在每人两边各放一只,哲学家们在肚子饥饿时才试图分两次从两边拿起筷子就餐。 条件: 1)拿到两只筷子时哲学家才开始吃饭。 2)如果筷子已在他人手上,则该哲学家必须等他人吃完之后才能拿到筷子。 3)任一哲学家在自己未拿到两只筷子前却不放下自己手中的筷子。
解题思路:
如果哲学家身边的2把筷子都没人使用,哲学家便可以就餐,否者哲学家只能等待别人就餐完毕。那么就根据哲学家身边的筷子状态做判断,满足条件便就餐,不满足则等待
代码:
1 public class PhilosopherTest { 2 public static void main(String args[]) { 3 Philosopher pl = new philosopher1(); 4 Thread thread1 = new Thread(pl, "1"); 5 Thread thread2 = new Thread(pl, "2"); 6 Thread thread3 = new Thread(pl, "3"); 7 Thread thread4 = new Thread(pl, "4"); 8 Thread thread5 = new Thread(pl, "5"); 9 thread1.start(); 10 thread2.start(); 11 thread3.start(); 12 thread4.start(); 13 thread5.start(); 14 } 15 16 } 17 18 class Philosopher implements Runnable{ 19 private static boolean[] fork = { false, false, false, false, false}; 20 21 @Override 22 public void run() { 23 while (true) { 24 eating(); 25 thinking(); 26 } 27 } 28 29 public synchronized void eating() { 30 try{ 31 int i = Integer.parseInt(Thread.currentThread().getName()); 32 if (fork[i % 5] == false && fork[i - 1] == false){ 33 Thread.sleep(500);//模拟吃饭过程 34 System.out.println("当前在吃饭的是" + Thread.currentThread().getName()); 35 fork[i % 5] = true; 36 fork[i - 1] = true; 37 }else{ 38 wait(); 39 } 40 }catch(Exception e){ 41 e.printStackTrace(); 42 } 43 } 44 45 public synchronized void thinking() { 46 try{ 47 int i = Integer.parseInt(Thread.currentThread().getName()); 48 if (fork[i % 5] == true && fork[i - 1] == true) { 49 Thread.sleep(500);//模拟思考过程 50 System.out.println(Thread.currentThread().getName() + "已经吃完饭了"); 51 fork[i % 5] = false; 52 fork[i - 1] = false; 53 notifyAll(); 54 } 55 }catch(Exception e){ 56 e.printStackTrace(); 57 } 58 59 } 60 }
死锁例证:哲学家就餐(代码片段)
由EdsgerDijkstra提出的哲学家就餐问题是一个经典的死锁例证。该问题的基本描述中是指定五个哲学家(本例中可以自由指定数目)。这些哲学家将花部分时间思考,花部分时间就餐。当他们思考时,不需要任何共... 查看详情
死锁例证:哲学家就餐(代码片段)
由EdsgerDijkstra提出的哲学家就餐问题是一个经典的死锁例证。该问题的基本描述中是指定五个哲学家(本例中可以自由指定数目)。这些哲学家将花部分时间思考,花部分时间就餐。当他们思考时,不需要任何共... 查看详情
用java多线程编写哲学家就餐程序利用多线程技术编写哲学家就餐程序,使之在运行时能演示产生死锁的情况,
好的话我可以给加分的、。。。。利用多线程技术编写哲学家就餐程序,使之在运行时能演示产生死锁的情况,也能演示采用死锁防止方法后不产生死锁的情况。 程序要采用简单的控制台界面,运行后在屏幕上显示功能菜单,... 查看详情
信号量解决哲学家就餐问题(gui动态演示)
问题描述:餐桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条。哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须同时拿到两只筷子才能吃饭。当5个哲学家都拿起自己右手边的筷子,准备拿左手边的筷... 查看详情
Go 中的哲学家就餐问题未通过单元测试
】Go中的哲学家就餐问题未通过单元测试【英文标题】:DiningphilosophersprobleminGofailsunittest【发布时间】:2022-01-1719:09:58【问题描述】:我正在学习围棋课程,其作业如下:用下面的方法实现餐饮哲学家的问题约束/修改。应该有5... 查看详情
多线程面试题——哲学家就餐问题(java)(代码片段)
哲学家就餐问题公众号:小成同学在coding文章如有问题欢迎指正5名哲学家,5根筷子,哲学家左右两边的筷子跟身边的人共享,只有同时拿起左手的筷子和右手的筷子,哲学家才可以夹菜。这个问题其实是一个... 查看详情
死锁例证:哲学家就餐(代码片段)
由EdsgerDijkstra提出的哲学家就餐问题是一个经典的死锁例证。该问题的基本描述中是指定五个哲学家(本例中可以自由指定数目)。这些哲学家将花部分时间思考,花部分时间就餐。当他们思考时,不需要任何共... 查看详情
python并发编程之死锁
...在这一节中,我们将讨论一个思想实验,通常被称为餐饮哲学家问题,以说明死锁的概念及其原因;从这里开始,你将学习如何在Python并发程序中模拟这个问题。哲学家就餐问题哲学家就餐(Diningphilosophersproble 查看详情
juc并发编程活跃性--死锁&定位死锁&哲学家就餐问题(代码片段)
1.死锁有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁示例:t1线程获得A对象锁,接下来想获取B对象的锁t2线程获得B对象锁,接下来想获取A对象的锁packagetian;importlombok.extern.slf4j.Slf4j;@Slf4j(topi... 查看详情
哲学家就餐问题(代码片段)
哲学家就餐问题是1965年由Dijkstra提出的一种线程同步的问题。问题描述:一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条。哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿到两只筷子才能吃饭... 查看详情
我应该如何使用条件变量解决哲学家就餐问题?
】我应该如何使用条件变量解决哲学家就餐问题?【英文标题】:HowshouldIsolvestarvinginDinningPhilosophersproblemusingconditionalvariables?【发布时间】:2019-09-2913:46:04【问题描述】:我用condition_variables写了一个模拟哲学家就餐的简单程序,... 查看详情
哲学家就餐问题(代码片段)
...成资源(叉子)的浪费.五把叉子,一次应该有两个不相邻的哲学家同时进餐. 2.算法实现数据结构1#defineN5//哲学家个数2#defineLEFTi-1//第i个哲学家的左邻居3#defineRIGHT(i+1)%N//第i个哲学家的右邻居4#defineTHINKING0//思考状态5#defineHU 查看详情
使用 pthread、互斥锁和条件变量解决哲学家就餐问题
】使用pthread、互斥锁和条件变量解决哲学家就餐问题【英文标题】:SolveDiningPhilosophersProblemUsingpthreads,mutexlocks,andconditionvariables【发布时间】:2020-07-2923:51:53【问题描述】:我正在尝试使用pthread、互斥锁和条件变量在C中实现哲... 查看详情
使用信号量 (BACI) 就餐哲学家
】使用信号量(BACI)就餐哲学家【英文标题】:Diningphilosophersusingsemaphores(BACI)【发布时间】:2018-06-0208:33:03【问题描述】:我必须通过使用信号量来解决哲学家就餐问题。在我的代码中,每一位哲学家都在拿一根筷子,其余的都在... 查看详情
这个解决哲学家就餐问题 (dpp) 的解决方案是如何工作的?互斥量和信号量
】这个解决哲学家就餐问题(dpp)的解决方案是如何工作的?互斥量和信号量【英文标题】:Howisthissolutionfordiningphilosophersproblem(dpp)working?Mutexandsemaphores【发布时间】:2019-10-2812:43:40【问题描述】:我正在尝试解决哲学家就餐问题(... 查看详情
关于哲学家就餐问题中wait()的运用,求大神解释。以下这些代码是对的还是错的?是不是解决了死锁问题
classForkprivatebooleantaken=false;synchronizedvoidput()taken=false;notify();synchronizedvoidget()throwsInterruptedExceptionwhile(taken)wait();taken=true;classPhilosopherextendsThreadprivateForkleft;privateForkright;Philosopher(...Forkl,Forkr)...left=l;right=r;...publicvoidrun()trywhile(true)//think... 查看详情
就餐哲学家——我对所有人说话,只有一个人在听
】就餐哲学家——我对所有人说话,只有一个人在听【英文标题】:Diningphilosophers-Ispoketoall,justonelistens【发布时间】:2015-08-0816:25:31【问题描述】:我正在实现哲学家就餐问题,我自己也遇到了一个问题,我不知道是什么原因,... 查看详情
ipc问题-哲学家就餐
如上图,有五位哲学家,盘中的食物只有左右两个叉子都拿起才能吃。哲学家在桌上只有思考(等待)和吃面(执行)。看起来最多是只有2个人能同时吃。 版本一:这个思路的最糟糕的就是都拿起左边叉子,那样... 查看详情