【Java】同步关键字就解决哲学家吃饭问题

来源:互联网 发布:在线支付源码 编辑:程序博客网 时间:2024/04/26 06:11
public class W05 {


public static void main(String[] args) {
// TODO Auto-generated method stub
kuaizi k1 = new kuaizi();
kuaizi k2 = new kuaizi();
kuaizi k3 = new kuaizi();
kuaizi k4 = new kuaizi();
zhexuejia z1 = new zhexuejia(k4, k1);
z1.setName("A");
zhexuejia z2 = new zhexuejia(k1, k2);
z2.setName("B");
zhexuejia z3 = new zhexuejia(k2, k3);
z3.setName("C");
zhexuejia z4 = new zhexuejia(k3, k4);
z4.setName("D");
z1.start();
z2.start();
z3.start();
z4.start();
}


}


class kuaizi{
boolean enable = true;
public void setTaken(boolean taken) {
this.enable = enable;
}
public synchronized void take() throws InterruptedException{
this.enable = false;
}
public synchronized void drop(){
this.enable = true;
this.notifyAll();
}
}


class zhexuejia extends Thread{
private kuaizi zuo;
private kuaizi you;
public zhexuejia(kuaizi zuo, kuaizi you) {
super();
this.zuo = zuo;
this.you = you;
}
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "正在思考");
if(zuo.enable){
zuo.take();
System.out.println(Thread.currentThread().getName() + "拿到了左筷子");
}else{
while(!zuo.enable){
System.out.println(Thread.currentThread().getName() + "正在等待左筷子");
//Thread.sleep(500);
}
}
//Thread.sleep(500);
if(you.enable){
you.take();
System.out.println(Thread.currentThread().getName() + "拿到了右筷子");
}else{
while(!you.enable){
System.out.println(Thread.currentThread().getName() + "正在等待右筷子");
//Thread.sleep(500);
}
}
System.out.println(Thread.currentThread().getName() + "正在吃饭");
zuo.drop();
you.drop();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
0 0
原创粉丝点击