多线程之哲学家就餐问题
1、问题描述
2、死锁
2.1产生死锁的原因
吃饭需要使用两根筷子才可以吃饭,哲学家需要先拿起一边的筷子,再去拿另一边的筷子。假如这个时候每个哲学家都同时拿起了右手边的筷子,去拿左手边筷子的时候,发现左手边的筷子被人拿走了,就需要等待,所有哲学家都在等待左手边的筷子,就造成了死锁。
2.2产生死锁的代码
java是面向对象的语言,所以需要从问题中抽出对象来进行代码的编写。由问题描述中得到两个对象:筷子和哲学家。
Chopstiack.java
/**
* 筷子
*/
public class Chopstick {
private String name;
public Chopstick(String name) {
this.name = name;
}
@Override
public String toString() {
return "Chopstick{" +
"name='" + name + '\'' +
'}';
}
}
Philosopher .java
哲学家类需要去拿筷子,每个哲学家只负责拿自己的筷子,也就是一个哲学家代表一个线程,所以需要继承Thread类。
/**
* 哲学家类
*/
public class Philosopher extends Thread{
Chopstick left;
Chopstick right;
public Philosopher(String name, Chopstick left, Chopstick right) {
super(name);
this.left = left;
this.right = right;
}
@Override
public void run() {
while (true) {
synchronized (left) {
synchronized (right) {
eat()