资源简介
Java哲学家就餐问题代码演示,基于多线程图形版的Java哲学家就餐问题演示,涉及到线程同步与互斥,临界区访问问题以及避免死锁的方法。
关于什么是哲学家就餐问题,请参考百度吧。
关于什么是哲学家就餐问题,请参考百度吧。
代码片段和文件信息
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.ImageIcon;
//////////////////////////////////////////////////
//筷子类
class Bamboo {
boolean bState; //互斥信号量
JLabel bLabel; //显示筷子的JLabel
ImageIcon emptyImagebambooImage; //被用时为empty图片,否则为筷子图片
public Bamboo(JLabel bLabel ImageIcon image) {
emptyImage=new ImageIcon(“空的.jpg“);
this.bLabel=bLabel;
this.bambooImage=image;
bState=true; //一开始都设筷子为可用状态
}
public synchronized void gainBamboo() {
while(!bState) { //如果此筷子已被用,则等待
try {
wait();
}catch(Exception e) {
e.printStackTrace();
}
}
bLabel.setIcon(emptyImage); //获得筷子,并把筷子所代表 的图片设为空
bState=false; //把此筷子的状态设为已被用了
}
public synchronized void takeBamboo() { //放下筷子,把筷子状态设为可用
bState=true;
bLabel.setIcon(bambooImage);
notify(); //唤醒其他在等待的线程,如果有等待此筷子的线程,则可以继续判断
}
}
//////////////////////////////////////////////////////////
//哲学家类,
class Zexuejia extends Thread {
int thinkSpeed eatSpeed; // 思考,吃饭的时间
Bamboo left right; // 哲学家的左右筷子
int num; // 第几号哲学家
JLabel zxjLable leftLable rightLable zxjLeftLabel zxjRightLabel; // zxjLable为哲学家设置状态的,
// leftLablerightLable为哲学家的左右两根,
// zxjLeftLabelzxjRightLabel为哲学家拿起两筷子后的
ImageIcon leftImage rightImage; //左右两个筷子的图片
Zexuejia(int num JLabel zLabel Bamboo left JLabel lLabel
Bamboo right // 哲学家构造函数
JLabel rLabel ImageIcon lImage ImageIcon rImage JLabel zLLabel
JLabel zRLabel) {
this.num = num;
this.zxjLable = zLabel;
this.left = left;
this.leftLable = lLabel;
this.right = right;
this.rightLable = rLabel;
this.leftImage = lImage;
this.rightImage = rImage;
this.zxjRightLabel = zRLabel;
this.zxjLeftLabel = zLLabel;
}
public void run() {
ImageIcon thinkImage = new ImageIcon(“thinking.gif“);
ImageIcon huangryImage = new ImageIcon(“huangry.gif“);
ImageIcon eatImage = new ImageIcon(“eating.gif“);
ImageIcon empty = new ImageIcon(“empty.jpg“);
while (true) {
zxjLable.setIcon(thinkImage);
do {
thinkSpeed = (int) (Math.random() * 10000); // 获得随机的思考时间
} while (thinkSpeed < 1500);
try {
sleep(thinkSpeed); // 以线程睡眠的方式让哲学家思考一些时间
} catch (Exception e) {
}
zxjLable.setIcon(huangryImage);
left.gainBamboo(); // 获得左边的筷子
zxjLeftLabel.setIcon(leftImage);
right.gainBamboo(); // 获得右边的筷子
zxjRightLabel.s
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 10732 2007-12-14 14:51 codesc.net\哲学家就餐:Java多线程实例图形版\bamboo.gif
文件 51967 2008-01-16 15:36 codesc.net\哲学家就餐:Java多线程实例图形版\eating.gif
文件 52110 2008-01-16 15:36 codesc.net\哲学家就餐:Java多线程实例图形版\huangry.gif
文件 5411 2008-01-16 15:24 codesc.net\哲学家就餐:Java多线程实例图形版\thinking.gif
文件 9419 2008-07-05 09:23 codesc.net\哲学家就餐:Java多线程实例图形版\Zxjfr
目录 0 2014-09-23 17:04 codesc.net\哲学家就餐:Java多线程实例图形版
目录 0 2014-09-23 17:04 codesc.net
----------- --------- ---------- ----- ----
129639 7
评论
共有 条评论