[Java]哲学家就餐问题
2015-08-25 09:24
441 查看
问题描述:
一群哲学家聚在一起就餐,每两个哲学家之间有一根筷子。每个哲学家需要两根筷子才能用餐,并且一定是先拿起左手边的筷子,然后再拿右手边的筷子。如果所有哲学家在同一时间拿起左手边的筷子,就有可能造成死锁。请使用线程和锁,编写模拟哲学家就餐问题。避免出现死锁。
解法:
首先,先不管死锁,实现哲学家就餐问题。有两个实体,筷子和哲学家。筷子被拿起和被放下与哲学家拿起筷子和放下筷子相对应。我们分别将它们封装成对象。
上面的程序,当哲学家都拿起左边的筷子,等待着右边的筷子,就有可能发生死锁。
为了预防死锁,当哲学家拿不到右边的筷子时,就让他放下已拿到的左边的筷子。
一群哲学家聚在一起就餐,每两个哲学家之间有一根筷子。每个哲学家需要两根筷子才能用餐,并且一定是先拿起左手边的筷子,然后再拿右手边的筷子。如果所有哲学家在同一时间拿起左手边的筷子,就有可能造成死锁。请使用线程和锁,编写模拟哲学家就餐问题。避免出现死锁。
解法:
首先,先不管死锁,实现哲学家就餐问题。有两个实体,筷子和哲学家。筷子被拿起和被放下与哲学家拿起筷子和放下筷子相对应。我们分别将它们封装成对象。
<pre name="code" class="java">public class Chopstick{ private Lock lock; public Chopstick(){ lock=new ReentrantLock(); } public void pickUp(){ lock.lock(); } public void pickDown(){ lock.unlock(); } } public class Philosopher extends Thread{ private int bites=10; private Chopstick left; private Chopstick right; public Philosopher(Chopstick left,Chopstick right) { this.left=left; this.right=right; } public void eat(){ pickUp(); chew(); putDown(); } public void pickUp() { left.pickUp(); right.pickUp(); } public void chew(){} public void putDown() { left.putDown(); right.putDown(); } public void run() { for(int i=0;i<bites;i++) { eat(); } } }
上面的程序,当哲学家都拿起左边的筷子,等待着右边的筷子,就有可能发生死锁。
为了预防死锁,当哲学家拿不到右边的筷子时,就让他放下已拿到的左边的筷子。
public class Chopstick{ private Lock lock; public Chopstick(){ lock=new ReentrantLock(); } public boolean pickUp(){ lock.tryLock(); } public void pickDown(){ lock.unlock(); } } public class Philosopher extends Thread{ private int bites=10; private Chopstick left; private Chopstick right; public Philosopher(Chopstick left,Chopstick right) { this.left=left; this.right=right; } public void eat(){ if(pickUp()){ chew(); putDown(); } } public boolean pickUp() { if(!left.pickUp())return false; if(!right.pickUp()) { left.putDown(); return false; } return true; } public void chew(){} public void putDown() { left.putDown(); right.putDown(); } public void run() { for(int i=0;i<bites;i++) { eat(); } } }参看书籍:程序员面试金典
相关文章推荐
- RMI java.rmi.ConnectException: Connection refused to host: 192.168.1.108
- java web项目防止多用户重复登录解决方案
- Java 无名方法,static方法
- 安装JDK后bin文件下没有tools.jar解决
- 马士兵Java视频第三章总结
- eclipse工具使用技巧&关联Android源码
- eclipse导入一个项目之后没有JRE System Library怎么办?
- SSi框架整合
- 直接topbar奔溃,出现 at java.lang.reflect.Constructor.constructNative(Native Method)
- maven在eclipse建立工程,运行出现Server IPC version 9 cannot communicate with client version 4错误
- 玩转Eclipse — 自动代码生成的Java Code Template
- java中实现四则运算代码
- java IO 学习笔记之FIle
- Java开发中学用eclipse code templates
- JSON 转javabean 利器
- java-内部类说明
- struts2学习笔记——03
- 《Java实战开发经典》第五章5.1
- java获得当前时间戳
- Myeclipse 安装 gradle 插件以及基本使用