package tianya.cn.philopherfood;
public class Chopstick {
private static int count = 0;
private int number = count++;
public String toString(){
return "Chopstick" + number;
}
}
===========================================
package tianya.cn.philopherfood;
import java.util.Random;
public class Philosopher extends Thread {
private static Random random = new Random();
private static int count = 0;
private int number = count++;
private Chopstick leftChopstick;
private Chopstick rightChopstick;
public static int ponder = 0;//package access,time of philosopher thinking
public Philosopher(Chopstick left, Chopstick right){
leftChopstick = left;
rightChopstick = right;
start();
}
public void thinking(){
System.out.println();
if(ponder > 0){
try {
sleep(random.nextInt(ponder));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void eat(){
synchronized (leftChopstick) {
System.out.println(this + " has " + this.leftChopstick + " waitting for " + this.rightChopstick);
}
synchronized (rightChopstick) {
System.out.println(this + "eating");
}
}
public String toString(){
return "Philospher" + number;
}
public void run(){
while(true){
thinking();
eat();
}
}
}
==========================================================
package tianya.cn.main;
import java.util.Timer;
import java.util.TimerTask;
import tianya.cn.philopherfood.Chopstick;
import tianya.cn.philopherfood.Philosopher;
public class DiningPhilosophers {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
if( args.length < 3){
System.err.println("输入参数错误!。。。。。。。");
System.exit(0);
}
Philosopher[] philosopher = new Philosopher[ Integer.parseInt(args[0]) ];
Philosopher.ponder = Integer.parseInt( args[1] );
Chopstick
left = new Chopstick(),
right = new Chopstick(),
first = left;
int i = 0;
if(i < philosopher.length - 1){
philosopher[i++] = new Philosopher(left, right);
left = right;
right = new Chopstick();
}
if(args[2].equals("deadlock")){
philosopher[i] = new Philosopher(left, first);
}else{
//swaping values prevents deadblock
philosopher[i] = new Philosopher(first, left);
}
//
if(args.length > 3){
int delay = Integer.parseInt( args[3] );
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("OVER!!!");
System.exit(0);
}
}, delay);
}
}
}
相关推荐
哲学家进餐问题的课程设计报告,包括课程设计背景,程序流图,源代码,分析,注解,以及课程设计总结。相当完整
死锁的四个条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个进程因请求资源而...先写一个会造成死锁的哲学家问题。当所有哲学家同时决定进餐,拿起左边筷子时候,就发生了死锁。
操作系统死锁问题 C语言实现 有详细代码 都能实现
死锁是进程并发执行过程中可能出现的现象,哲学家就餐问题是描述死锁的经典例子。假设有几位哲学家围坐在一张餐桌旁,桌上有吃不尽的食品,每两位哲学家之间摆放着一根筷子,筷子的个数与哲学家的数量相等,每一位...
哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。要求是: 每一个哲学家只有在拿到位于他左右的筷子后,才能够就餐;哲学家只能先拿左边的筷子,再去拿右边的筷子,而不能同时去抓他两边的筷子,...
哲学家多线程 java
哲学家就餐问题图形界面(代码教程见博客:...(2)有图形界面直观显示哲学家取筷子,吃饭,放筷子,思考等状态。(3)为增强结果的随机性,各个状态之间的维持时间采用随机时间,例如100ms-500ms 之间。
多进程/线程编程:哲学家问题。 设置进程/线程,描述哲学家 ; 随机启动哲学家 ;... 编写正确的哲学家程序,设法延迟线程的执行,使之出现死锁; 编写正确的哲学家程序,保证不出现死锁;
计算机系统实验报告(哲学家就餐死锁).pdf
哲学家就餐:Java多线程实例图形版 哲学家就餐是一个经典的Java多线程编程的实例,这是图形版。涉及到线程同步与互斥,临界区访问问题以及避免死锁的方法。 哲学家就餐:有五个哲学家绕着圆桌坐,每个哲学家...
哲学家就餐问题是一个经典的同步问题,用多线程编程实现哲学家就餐问题
有五个哲学家围成一圈,每人左右各有一只筷子,每人只能使用自己左右的筷子,当拿起左右筷子后就可以吃饭,否则就等待。
哲学家进餐问题是一个多线程运用的经典例子,涉及到线程同步/互斥,临界区访问问题以及一个避免死锁的解决方法。 有五个哲学家绕着圆桌坐,每个哲学家面前有一盘面,两人之间有一支筷子,这样每个哲学家左右各有一...
哲学家吃饭问题(vc代码) 哲学家吃饭问题(vc代码) 哲学家吃饭问题(vc代码) 哲学家吃饭问题(vc代码) 哲学家吃饭问题(vc代码)
一个简单的cpp文件,一种简单的实现方法,初学者可用于参考
哲学家进餐的一个小程序,5个哲学家围坐在一张圆桌周围,每个哲学家面前有一碟...哲学家包含三种状态:吃饭、思考和挨饿。当一个哲学家觉得饿时,他才试图分两次去取他左边和右边的筷子就餐,吃完以后放下筷子继续思。
哲学家吃饭问题 c++编程 操作系统 实例
哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有...
使用Linux线程信号量实现哲学家问题,只用信号量和互斥量。问题描述:由Dijkstra提出并解决的哲学家进餐问题(The Dinning Philosophers Problem)是典型的同步问题。该问题是描述有五个哲学家共用一张圆桌,分别坐在...
哲学家思考后,过一定的时间就会饥饿,饥饿之后就想吃饭,吃饭后再思考。房间里有一张圆桌,桌子周围放有6把椅子,分别属于6位哲学家,每两位哲学家之间有1支筷子,哲学家进食时必须同时使用左右两支筷子。