Я ищу способ решить проблему обеденных философов с помощью семафоров, я довольно зациклен на том, как я должен это делать. Я включил свой код ниже.Рестораны Философы с помощью семафоров
class ChopStick{
private int count;
private boolean inuse;
Lock lock = new ReentrantLock();
Condition notInUse = lock.newCondition();
public ChopStick(){
inuse = false;
}
public void pickUp(){
lock.lock();
try{
while(inuse){
try{
notInUse.await();
}catch(InterruptedException e){}
}
inuse = true;
}finally{lock.unlock();}
}
public void putDown(){
lock.lock();
try{
inuse = false;
notInUse.signal();
}finally{lock.unlock();}
}
}
class Philosopher extends Thread{
Semaphore sem;
private ChopStick ch1,ch2; //chopsticks
private int phil; //philosopher id
public Philosopher(int p, ChopStick left, ChopStick right, Semaphore s){
phil = p;
ch1 = left;
ch2 = right;
sem = s;
}
public void run() {
while(true){
try {
sem.acquire();
} catch (InterruptedException e) {}
think(phil);
//pickup chopsticks
ch1.pickUp();
ch2.pickUp();
eat(phil);
//putdown chopsticks
ch1.putDown();
ch2.putDown();
sem.release();
}
}
Я имею в виду, когда философ поднимает палочку, используя sem.acquire()
, а затем, когда они закончили использовать sem.release()
, но я не уверен, если это правильно. Это?
Редактировать Так я реализовал это. Кажется, работает, но я не уверен.
class ChopStick{
private Semaphore sem;
public ChopStick(Semaphore s){
sem = s;
}
public void pickUp(){
try{
sem.acquire();
}catch(InterruptedException e){}
}
public void putDown(){
sem.release();
}
https://www.youtube.com/watch?v=M3CNoX8wetM – Anonymous
Я знаю, как это работает, я ищу, чтобы решить с помощью семафоров. – Strobes
@Strobes Новый код может зайти в тупик, см. Редактирование моего ответа, чтобы предотвратить это. –