哲学家就餐问题的思考(java实现)
来源:互联网 发布:淘宝创业故事 编辑:程序博客网 时间:2024/06/04 23:05
前言
这是我第一眼看到该问题时想到的解决方式之一,不知道可不可行,如果大家有什么看法可以探讨探讨。
问题描述
有五个哲学家,他们的生活方式是交替地进行思考和进餐,n哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,n平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,n进餐完毕,放下筷子又继续思考。
约束条件
(1)只有拿到两只筷子时,哲学家才能吃饭。
(2)如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。
(3)任一哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子。
产生的问题
5个哲学家同时获取筷子,那么就会产生死锁。
思考
如果死锁是由于5个哲学家同时拿左手(或右手)边的筷子导致死锁的话,那为什么不改变其中一个哲学家的取筷子顺序呢,毕竟题目约束条件没说必须每个哲学家都得先拿左手(或右手)。
所以我觉得可以改变其中一个哲学家的取筷子顺序来解开死锁问题。
例如:改变第一个哲学家的取筷子顺序,让他先拿右手的筷子,其他四个哲学家都是先拿左手的筷子。这样总会有最后一个筷子空余着防止死锁产生。
java实现方法
- 五个哲学家相当于五个线程
- 五双筷子由一个仓库管理
五双筷子管理实现
五双筷子从编号1开始(没从0开始别喷我。。。)。
package DinningPhilosophers;import java.util.LinkedList;/** * Created by maxi on 2017/11/8. */public class DinningTool { private LinkedList<Integer> linkedList = new LinkedList<>(); public DinningTool() { linkedList.add(1); linkedList.add(2); linkedList.add(3); linkedList.add(4); linkedList.add(5); } //拿走 remove public void pickUp(Integer e) { synchronized (linkedList) { try { while (!linkedList.contains(e)) linkedList.wait(); linkedList.remove(e); linkedList.notifyAll(); } catch (Exception e1) { e1.printStackTrace(); } } } //放下 add public void dropDown(Integer e) { synchronized (linkedList) { try { linkedList.add(e); linkedList.notifyAll(); } catch (Exception e1) { e1.printStackTrace(); } } }}
五个哲学家实现
五个线程,其中一个线程先取右边的筷子,其他四个线程都先取左边的筷子。
例如:
public static void main(String[] args) { DinningTool dinningTool = new DinningTool(); //哲学家1 Thread one = new Thread(() -> { int num = 0; while (true) { try { dinningTool.pickUp(1);// System.out.println("one start to pickup 1 right!"); dinningTool.pickUp(5);// System.out.println("one start to pickup 5 left!");// System.out.println("one start to eat!"); Thread.sleep(300); dinningTool.dropDown(1);// System.out.println("one start to dropdown 1 right!"); dinningTool.dropDown(5);// System.out.println("one start to dropdown 5 left!");// System.out.println("one start to think!"); Thread.sleep(500); num++; System.out.println("one recycle ====================================" + num); } catch (Exception e) { e.printStackTrace(); } } }); //哲学家2 Thread two = new Thread(() -> { int num = 0; while (true) { try { dinningTool.pickUp(1);// System.out.println("two start to pickup 1 left!"); dinningTool.pickUp(2);// System.out.println("two start to pickup 2 right!");// System.out.println("two start to eat!"); Thread.sleep(300); dinningTool.dropDown(1);// System.out.println("two start to dropdown 1 left!"); dinningTool.dropDown(2);// System.out.println("two start to dropdown 2 right!");// System.out.println("two start to think!"); Thread.sleep(500); num++; System.out.println("two recycle ====================================" + num); } catch (Exception e) { e.printStackTrace(); } } }); //哲学家3 Thread three = new Thread(() -> { int num = 0; while (true) { try { dinningTool.pickUp(2);// System.out.println("three start to pickup 2 left!"); dinningTool.pickUp(3);// System.out.println("three start to pickup 3 right!");// System.out.println("three start to eat!"); Thread.sleep(300); dinningTool.dropDown(2);// System.out.println("three start to dropdown 2 left!"); dinningTool.dropDown(3);// System.out.println("three start to dropdown 3 right!");// System.out.println("three start to think!"); Thread.sleep(500); num++; System.out.println("three recycle ====================================" + num); } catch (Exception e) { e.printStackTrace(); } } }); //哲学家4 Thread four = new Thread(() -> { int num = 0; while (true) { try { dinningTool.pickUp(3);// System.out.println("four start to pickup 3 left!"); dinningTool.pickUp(4);// System.out.println("four start to pickup 4 right!");// System.out.println("four start to eat!"); Thread.sleep(300); dinningTool.dropDown(3);// System.out.println("four start to dropdown 3 left!"); dinningTool.dropDown(4);// System.out.println("four start to dropdown 4 right!");// System.out.println("four start to think!"); Thread.sleep(500); num++; System.out.println("four recycle ====================================" + num); } catch (Exception e) { e.printStackTrace(); } } }); //哲学家5 Thread five = new Thread(() -> { int num = 0; while (true) { try { dinningTool.pickUp(4);// System.out.println("five start to pickup 4 left!"); dinningTool.pickUp(5);// System.out.println("five start to pickup 5 right!");// System.out.println("five start to eat!"); Thread.sleep(300); dinningTool.dropDown(4);// System.out.println("five start to dropdown 4 left!"); dinningTool.dropDown(5);// System.out.println("five start to dropdown 5 right!");// System.out.println("five start to think!"); Thread.sleep(500); num++; System.out.println("five recycle ====================================" + num); } catch (Exception e) { e.printStackTrace(); } } }); one.start(); two.start(); three.start(); four.start(); five.start(); }
结束
有啥问题一定要跟我说啊!:)
阅读全文
0 0
- 哲学家就餐问题的思考(java实现)
- 哲学家就餐的问题--java实现
- 哲学家就餐问题(java实现)
- 哲学家就餐问题(java实现)
- Java实现哲学家就餐问题
- 哲学家就餐问题实现
- [Java]哲学家就餐问题
- 哲学家就餐问题 Java语言实现
- 哲学家就餐问题的C#实现
- 哲学家就餐问题的C#实现
- 哲学家就餐问题的C#实现
- 哲学家就餐问题(C语言实现)
- java多线程--哲学家就餐问题
- 操作系统的哲学家就餐问题
- 哲学家就餐问题及其一种java多线程实现
- 多线程经典问题--哲学家就餐问题解决方案JAVA实现
- Chandy/Misra解法 解决哲学家就餐问题 java实现
- 哲学家就餐问题在 linux 上的程序实现
- MySQL练习时所遇问题
- IDA动态调试技术及Dump内存
- Java 技术之垃圾回收机制
- Java主流几大框架的对比(EasyUI,Bootstrap,Struts2,SpingMvc,Ejb,Spring,Hibernate,Mybatis)
- Error:Unable to resolve dependency for ':app@stage/compileClasspath': Could not resolve project :mvp
- 哲学家就餐问题的思考(java实现)
- C# Webservice XML通信的基本方法(一 Webservice 接口的使用)
- parqute orc 存储文件格式
- 推荐几本经典计算机书籍
- Android 内存泄漏总结及如何避免
- Groovy常用语法总结
- async_read_until函数以及streambuf如何使用
- 边框加上阴影,内外阴影都有
- java的static关键字