33 lines
651 B
Java
33 lines
651 B
Java
import java.util.concurrent.Semaphore;
|
|
|
|
class Table {
|
|
|
|
private int numForks;
|
|
private Semaphore[] forks;
|
|
|
|
public Table(int numForks) {
|
|
this.numForks = numForks;
|
|
|
|
this.forks = new Semaphore[numForks];
|
|
for (int i = 0; i < this.numForks; i++) {
|
|
this.forks[i] = new Semaphore(1);
|
|
}
|
|
}
|
|
|
|
public void takeForks(int i) throws InterruptedException {
|
|
int left = i;
|
|
int right = (i + 1) % numForks;
|
|
if (right > left) {
|
|
forks[left].acquire();
|
|
forks[right].acquire();
|
|
} else {
|
|
forks[right].acquire();
|
|
forks[left].acquire();
|
|
}
|
|
}
|
|
|
|
public void returnForks(int i) {
|
|
forks[i].release();
|
|
forks[(i + 1) % numForks].release();
|
|
}
|
|
} |