五位哲学家用餐问题相信大家也知道,大概就是五位哲学家在圆形餐桌上吃饭,每两位哲学家之间有一根筷子,即每位哲学家左右两边都有一根筷子,接下来哲学家的步骤是:拿起左右筷子用餐 =》中间放下左右筷子思考 =》继续拿起左右筷子用餐 =》用餐完毕,涉及到并发处理及死锁的避免问题
话不多说,上代码:
package com.PTakeUpChopStick;
public class ChopStick {
public boolean available = true;
public int num;
public ChopStick(int num) {
// TODO Auto-generated constructor stub
this.num = num;
}
public synchronized boolean takeup(int id) {
if(available) {
// System.out.println("哲学家" + id + "拿起" + "chop" + num + ":takeup");
available = false;
return true;
}else {
return false;
}
}
public void putdown(int id) {
// System.out.println("哲学家" + id + "放下" + "chop" + num + ":putdown");
available = true;
}
}
package com.PTakeUpChopStick;
public class Philosopher extends Thread{
private int id;
private ChopStick leftChop;
private ChopStick rightChop;
public Philosopher(int id, ChopStick leftChop, ChopStick rightChop) {
// TODO Auto-generated constructor stub
this.id = id;
this.leftChop = leftChop;
this.rightChop = rightChop;
}
public void think() {
leftChop.putdown(id);
rightChop.putdown(id);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
boolean bl=false;
boolean br=false;
while(!bl || !br) {
// System.out.println(id+":left:" + leftChop.available);
// System.out.println(id+":right:" + rightChop.available);
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
bl = leftChop.takeup(id);
br = rightChop.takeup(id);
//解决拿起了一只筷子没有退出循环下次循环这只筷子没有被任何人占用却为false的问题
if(bl ^ br) {
if(bl) {
leftChop.putdown(id);
}
if(br) {
rightChop.putdown(id);
}
}
}
try {
System.out.println("哲学家" + id + ":用餐中。。。");
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("哲学家" + id + ":思考中。。。");
think();
bl=false;
br=false;
while(!bl || !br) {
// System.out.println(id+":left:" + leftChop.available);
// System.out.println(id+":right:" + rightChop.available);
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
bl = leftChop.takeup(id);
br = rightChop.takeup(id);
if(bl ^ br) {
if(bl) {
leftChop.putdown(id);
}
if(br) {
rightChop.putdown(id);
}
}
}
try {
System.out.println("哲学家" + id + ":用餐中。。。");
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("哲学家" + id + ":用餐完毕"); //用餐完毕,放下筷子让别人吃
leftChop.putdown(id);
rightChop.putdown(id);
}
}
package com.PTakeUpChopStick;
public class PTakeUpChopStickTest {
static ChopStick[] chopsticks = new ChopStick[5];
static Philosopher[] philos = new Philosopher[5];
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i = 0;i < 5;++i) {
chopsticks[i] = new ChopStick(i);
}
for(int i = 0;i < 5;++i) {
philos[i] = new Philosopher(i, chopsticks[i], chopsticks[(i+1)%5]);
}
for(int i = 0;i < 5;++i) {
philos[i].start();
}
}
}
下面是运行截图: