哲学家就餐问题实现
来源:互联网 发布:数控车床软件编程 编辑:程序博客网 时间:2024/05/21 17:20
- 直接对筷子资源进行加锁,只允许一个人同时吃,这种情况只能同时一个人吃
public class PerThread extends Thread { private static int[] chopstick = { 1, 1, 1, 1, 1 }; private int i; public PerThread(int i) { this.i = i; } @Override public void run() { synchronized (chopstick) { eat(this.getName()); think(this.getName()); } } private void think(String name) { chopstick[i] = 1; chopstick[(i + 1) % 5] = 1; System.out.println("per"+name+" is thinking..."); } private void eat(String string) { while (true) { if (chopstick[i] != 0) { chopstick[i]--; System.out.println("per" + this.getName() + " got left chopstick."); break; } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } while (true) { if (chopstick[(i + 1) % 5] != 0) { chopstick[(i + 1) % 5]--; System.out.println("per" + this.getName() + " got right chopstick."); break; } } System.out.println("per" + string + " is eating..."); } }
测试程序
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub for (int i = 0; i < 5; i++) { Thread t = new PerThread(i); t.start(); } }}
2.每个哲学家必须确定自己左右手的筷子都可用的时候,才能同时拿起两只筷子进餐,吃完之后同时放下两只筷子。可以看到最多只能有两条相邻的eating结果,因为每个时刻最多能够满足两个人同时进餐,且两人座位不相邻
class Fork{ /*5只筷子,初始为都未被用*/ private boolean[] used={false,false,false,false,false}; /*只有当左右手的筷子都未被使用时,才允许获取筷子,且必须同时获取左右手筷子*/ public synchronized void takeFork(){ String name = Thread.currentThread().getName(); int i = Integer.parseInt(name); while(used[i]||used[(i+1)%5]){ try { wait();//如果左右手有一只正被使用,等待 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } used[i ]= true; used[(i+1)%5]=true; } /*必须同时释放左右手的筷子*/ public synchronized void putFork(){ String name = Thread.currentThread().getName(); int i = Integer.parseInt(name); used[i ]= false; used[(i+1)%5]=false; notifyAll();//唤醒其他线程 }}
class Philosopher extends Thread{ private String name; private Fork fork; public Philosopher(String name,Fork fork){ super(name); this.name=name; this.fork=fork; } public void run(){ while(true){ thinking(); fork.takeFork(); eating(); fork.putFork(); } } public void eating(){ System.out.println("I am Eating:"+name); try { sleep(1000);//模拟吃饭,占用一段时间资源 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void thinking(){ System.out.println("I am Thinking:"+name); try { sleep(1000);//模拟思考 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
测试程序
public class Test1 { public static void main(String[] args) { // TODO Auto-generated method stub Fork fork = new Fork(); new Philosopher("0",fork).start(); new Philosopher("1",fork).start(); new Philosopher("2",fork).start(); new Philosopher("3",fork).start(); new Philosopher("4",fork).start(); }}
转载自http://www.cnblogs.com/vettel/p/3438257.html
阅读全文
0 0
- 哲学家就餐问题实现
- Java实现哲学家就餐问题
- 哲学家就餐问题的C#实现
- 哲学家就餐问题的C#实现
- 哲学家就餐问题的C#实现
- 哲学家就餐的问题--java实现
- 哲学家就餐问题(C语言实现)
- Linux下实现哲学家就餐问题
- 哲学家就餐问题(java实现)
- 哲学家就餐问题(java实现)
- 哲学家就餐问题 Java语言实现
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题 锁
- 哲学家就餐问题
- 哲学家就餐问题
- 关于哲学家就餐问题
- 特长生模拟——八数码问题
- PCA 主成分分析Principal components analysis
- SDK安装的闪退问题
- 最新盘点当今10个顶尖的机床系统及厂家
- CTF 题目练习题库
- 哲学家就餐问题实现
- ubuntu 16.04 下配置intel/caffe
- [bzoj4931][SDOI省队集训2017]塔
- Python学习 Python3.5+PyQt5环境--------01、从一个GUI开始
- vs报错解决方法
- 自定义pch文件,设置宏定义
- CentOS7 yum 安装git
- 深度学习笔记(持续更新)
- 经典算法之选择排序(直接选择、堆排序)