我正准备接受编程采访,并认为我应该尝试为餐饮哲学家问题实施各种解决方案。
虽然我能够实施Dijkstra和Tannenbaum的解决方案,但我无法找到问题的服务员和仲裁者解决方案。
现在,我能想到的是应该有一个Waiter类和一个Arbitrator类(这是我实现的tryToEat()和isDoneEating()方法)而在Waiter类中我打算实现(permissionToEat) () 方法)。所有类都与Forks的单独类进行交互,我使用以下代码:
public class Fork {
private final Semaphore semaphore = new Semaphore(1);
private final int numberAroundTable;
private boolean usedFork = false;
public Fork(int numberAroundTable) {
this.numberAroundTable = numberAroundTable;
}
public int getNumberAroundTable() {
return numberAroundTable;
}
//'use' method to try pickup a fork and if successful change usedChopstick to true
public void use(){
try {
semaphore.acquire();
usedFork = true;
} catch (InterruptedException e) {
usedFork = false;
}
}
public void putDown(){
usedFork = false;
semaphore.release();
}
public boolean isUsed(){
return usedFork;
}
}
如果我使用我想到的方法以及我缺少什么,那么实施服务员和仲裁者解决方案的伪代码应该是什么?