线程学习五:哲学家就餐问题

author author     2022-08-08     292

关键词:

问题描述:

设有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个人能同时吃。  版本一:这个思路的最糟糕的就是都拿起左边叉子,那样... 查看详情