Использование класса оркестровщика, чтобы избежать голода, терпит неудачу из-за отсутствия справедливости
Я пытаюсь реализовать программу, которая содержит класс Supervisor и много работ, контролируемых этим классом. Пусть у нас будет 1 супервизор и 125 работников (и супервизоры, и работники являются потоками). Работники будут работать так долго, как того требует класс супервизора, т.е. он устанавливает общий "статус" для выполнения.
Моя проблема - голод. Мое решение заключается в использовании класса "Orchestrator" для переключения между 2.
public class Orchestrator {
private volatile int turn;
public Orchestrator(int turn) {
this.turn = turn;
}
public synchronized int query() {
return turn;
}
public synchronized void set(int otherTurn) {
turn = otherTurn;
}
}
Когда работники хотят что-то сделать, он выполнит запрос, а если наступит его очередь, то он выполнит свою работу и назначит очередь на руководителя. То же самое относится и к руководителю. Моя проблема заключается в том, что поток супервизора никогда не может ни выполнить запрос, ни установить очередь работника....
PS Я использую только два значения для очереди, 1 для руководителя и 0 для рабочего, оба определены в интерфейсе, что позволяет мне принимать решение о месте.