标红的地方便是算法的关键思想,理解了就相当简单了。不理解的可以根据注释理解一下。
1.同时拿起两只筷子才允许吃饭。
package tset;
class Philosopher extends Thread {
int id;
private Chopsticsks chopsticsks;
public Philosopher(int num,Chopsticsks chopsticsks) {
super();
id=num;
this.chopsticsks = chopsticsks;
}
public void run() {
while (true) {
thinking(); //思考吃什么
chopsticsks.take();//拿起筷子
eating(); //吃
chopsticsks.put(); //放下筷子
}
}
private void thinking() {
System.out.println("哲学家 " + id + ": 开始思考!");
try {
sleep(1000); //思考时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void eating() {
System.out.println("哲学家" + id + " : 开始食用!");
try {
sleep(1000); //吃东西会花时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Chopsticsks {
private boolean[] used = { false, false, false, false, false }; //初始化筷子为未使用
public synchronized void take() {
Philosopher p = (Philosopher) Thread.currentThread();
int id = p.id;
//两只筷子有一个已使用,则处于等待状态
while (used[id] || used[(id + 1) % 5]) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("哲学家" + id + "拿起两只筷子:"+id+"、"+(id + 1) % 5);
used[id] = true; //将筷子设为已使用
used[(id + 1) % 5] = true;
}
@SuppressWarnings("deprecation")
public synchronized void put() {
Philosopher p = (Philosopher) Thread.currentThread();
int id = p.id;
System.out.println("哲学家" + id + "放下手中的筷子:"+id+"、" +(id + 1) % 5);
used[id] = false; //将筷子设为未使用
used[(id + 1) % 5] = false;
notifyAll(); //唤醒所有等待队列中的进程
}
}
public class Second {
public static void main(String[] args) {
Chopsticsks chopsticsks = new Chopsticsks();
new Philosopher(0,chopsticsks).start();
new Philosopher(1,chopsticsks).start();
new Philosopher(2,chopsticsks).start();
new Philosopher(3,chopsticsks).start();
new Philosopher(4,chopsticsks).start();
}
}
结果截图: