我只是想知道这是否有解决java中的餐饮哲学家问题?
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MainClass {
public static void main(String[] args) {
Lock forks[] = new ReentrantLock[5];
for(int i = 0; i<5; i++){
forks[i] = new ReentrantLock();
}
Thread p1 = new Thread(new Philosopher(forks[4], forks[0], "first"));
Thread p2 = new Thread(new Philosopher(forks[0], forks[1], "second"));
Thread p3 = new Thread(new Philosopher(forks[1], forks[2], "third"));
Thread p4 = new Thread(new Philosopher(forks[2], forks[3], "fourth"));
Thread p5 = new Thread(new Philosopher(forks[3], forks[4], "fifth"));
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
}
}
和我的哲学家班:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Philosopher implements Runnable {
Lock leftFork = new ReentrantLock();
Lock rightFork = new ReentrantLock();
String name;
public Philosopher(Lock leftFork, Lock rightFork, String name) {
this.leftFork = leftFork;
this.rightFork = rightFork;
this.name = name;
}
@Override
public void run() {
while(true){
think(name);
eat(leftFork, rightFork, name);
}
}
private void eat(Lock leftFork, Lock rightFork, String name){
leftFork.lock();
rightFork.lock();
System.out.println(name + " eating...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
leftFork.unlock();
rightFork.unlock();
System.out.println(name + " done eating...");
}
}
private void think(String name){
System.out.println(name + " thinking...");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
感觉应该有更多的..代码。但我已经运行该程序,它确实是问题要求我解决。只有两位哲学家在任何时候都在吃东西,而另一方面他们正在思考。
我有这个权利吗?
答案 0 :(得分:2)
不,这段代码不会死锁。
所有5位哲学家都有可能获得他们的左叉;然后他们将永远等待他们的正确分叉。
为了证明这一点,请在sleep()
和println()
之间插入一个简短的leftFork.lock()
,甚至只是rightFork.lock()
,这会使其在大多数时间内失败。即使没有引起额外的延迟,当前的代码偶尔会在我的系统上失败。