当前位置:  技术问答>java相关

****用JAVA写了一个哲学家问题,但是运行的时候有异常,大家有时间的帮我看看******

    来源: 互联网  发布时间:2015-10-04

    本文导语:  刚刚学,对JAVA的线程同步还不了解,估计问题出在同步那里 哲学家问题: 一个房间内有5个哲学家(我用5个Frame来表示),他们的生活就是思考(短的Frame)和进食(长的Frame)。房间里有一张圆桌,中间放着一盘通...

刚刚学,对JAVA的线程同步还不了解,估计问题出在同步那里
哲学家问题:
一个房间内有5个哲学家(我用5个Frame来表示),他们的生活就是思考(短的Frame)和进食(长的Frame)。房间里有一张圆桌,中间放着一盘通心粉(假定通心粉无限多)。桌子周围放有五把椅子,分别属于五位哲学家。每两位哲学家之间有一把叉子,哲学家进食时必须同时使用左右两把叉子。如果没有凑齐就等待。


我的源代码如下:(比较长,不知道大家有没有耐心 -_-)

—————————————————————————————————————
—————————————————————————————————————

import java.lang.Runnable;
import java.awt.Frame;
import java.awt.event.*;

//叉子
class fork {

//叉子是否在使用
boolean inuse;
//初始化
fork(){
inuse = false;
}
}


//哲学家
class philosopher extends Frame implements Runnable{
//哲学家的位置和号码
int x,y,width,height,number;
fork left = new fork();
fork right = new fork();
//初始化
philosopher(int number){
super();
setBounds(150*number,100,150,200);
this.number = number;
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
new Thread(this).start();
}
//思考的方法
void think(){
this.setSize(150,200);
this.setTitle("thinking");
}
//吃饭的方法
void eat(){
this.setSize(150,400);
this.setTitle("eating");
}
//开始思考了
public void run(){
    while(true){
this.think();
try { Thread.sleep(3000); } catch(Exception e) {};
doallways();
    }
}
        //饿了,开始找叉子和吃饭(这里有问题,但是我不知道是什么)
synchronized void doallways(){
   if(this.right.inuse)//报错提示说这行有错,似乎是没有初始化就使用
try  { wait(); } catch(InterruptedException e) {};
   if(this.left.inuse) 
try  { wait(); } catch (InterruptedException e){} ;
   this.right.inuse = true;
   this.right.inuse = true;
   this.eat();
   try { Thread.sleep(3000); } catch(Exception e) {};
   this.right.inuse = false;
   this.left.inuse = false;
   notify();
   notify();
}
}

//主类,执行
class philosophers{
public static void main(String args[]){
//来了5个带叉子的哲学家
int i;
fork[] forks = new fork[5];
philosopher[] ph = new philosopher[5];
for(i=0;i

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • SecureCRT上运行一个JAVA程序,该程序类似一个在WINDOWS下一直运行的CMD窗口的东西,SecureCRT关掉后,JAVA还会继续运行吗?
  • 我用JBUILDER7。只有两三天,问:一个项目有一个welcomeapp.java ,还有一个是welcomappframe.java,请问那一是主表单,(即运行时,运行的
  • java显示当前运行时的参数(java运行参数)
  • java教程之java程序编译运行图解(java程序运行)
  • 谁知道为什么我的TextPad中没有编译Java、运行Application、运行Applet这三个选项????
  • 哪有jvm(java虚拟机)下载,为了让ie运行一些java程序!
  • linux环境下,java程序手工运行不乱码,crontab自动运行就乱码
  • 我想学java,那java的运行环境是什么?
  • 开发的java工程系统运行在linex上,现在想监控这个系统的运行情况
  • java初手,请问到那里下载java在ie下面的插件,让ie可以运行applet
  • 请问java编制的程序主要运行在服务器端还是客户端?听说它的速度比较慢,怎么可以运行在服务器端呢?谢谢!
  • 请问在java多线程中,是只有run(){}内的代码运行在一个新线程下呢?还是这个类中的代码都运行在一个新线程下?
  • 低级问题:.java文件交付用户怎么运行,难道也是DOS下:java xx.java?有没有.exe?
  • 最入门级的java问题,如何运行HelloWorld.java
  • jdk1.4 单独运行java应用程序单独运行出现环境变量问题?问题解决马上给分!!
  • 我用telnet登陆到linux下运行了一个java程序,在关闭了telnet后怎么能让这个java程序继续执行
  • 请问在LINUX下JAVA的平台是什么?如我在WIN下开发了JAVA程序,如何在LINUX下运行呢?
  • 为何在appletviewer中可以正确运行的java applet程序在IE5.0浏览器中不能运行
  • 怎样配置java 2 的运行环境
  • 我用telnet登陆到linux下运行了一个java程序,在关闭了telnet后怎么能让这个java程序继续执行,请高手指点一下
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3