当前位置: 技术问答>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
哲学家问题:
一个房间内有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