package cn.hctech2006.concurrent.thread41;
/**
* 哲学家就餐问题,确保左右手筷子都可以使用并且同时拿起与放下两根筷子
*/
public class Philosopher implements Runnable{
private String name;
private Fork fork;
public Philosopher(Fork fork) {
this.fork = fork;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Fork getFork() {
return fork;
}
public void setFork(Fork fork) {
this.fork = fork;
}
@Override
public void run() {
while (true){
try {
String name = Thread.currentThread().getName();
System.out.println("I am Thinking:"+name);
Thread.sleep(1000);
fork.takeFork();
System.out.println("I am Eating:"+name);
Thread.sleep(1000);
fork.putFork();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Fork{
private boolean []used={false,false,false,false,false};
public synchronized void takeFork(){
String name = Thread.currentThread().getName();
//System.out.println("name:"+name);
int i = Integer.parseInt(name);
while (used[i] || used[(i+1)%5]){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
used[i] = true;
used[(i+1)%5]=true;
}
public synchronized void putFork(){
String name = Thread.currentThread().getName();
int i = Integer.parseInt(name);
used[i] = used[(i+1)%5]=false;
this.notifyAll();
}
}
class ThreadTest{
public static void main(String[] args) {
Fork fork = new Fork();
for (int i = 0; i < 5; i ++){
new Thread(new Philosopher(fork), String.valueOf(i)).start();
}
}
}
Java哲学家就餐问题
最新推荐文章于 2021-02-16 05:20:39 发布