• 大小: 106KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-06-17
  • 语言: Java
  • 标签:

资源简介

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多线程实例图形版\Zxjframe.java

     目录          0  2014-09-23 17:04  codesc.net\哲学家就餐:Java多线程实例图形版

     目录          0  2014-09-23 17:04  codesc.net

----------- ---------  ---------- -----  ----

               129639                    7


评论

共有 条评论