Я столкнулся с проблемой в рамках мастерской Санта-Клауса, где должно случиться множество вещей до подарков. Одним из таких требований является то, что одиннадцать эльфов успешно производят 100 подарков. Мой главный класс выглядит следующим образом:Как правильно использовать семафоры
public class Main {
public volatile int toyList = 100;
public int getToyList() {
return toyList;
}
public void setToyList(int toyList) {
this.toyList = toyList;
}
public static void main(String[] args){
Main main = new Main();
...
Elf elfOne = new Elf("Jim", main);
Elf elfTwo = new Elf("John", main);
Elf elfThree = new Elf("Eamonn", main);
Elf elfFour = new Elf("Eoin", main);
Elf elfFive = new Elf("Ronan", main);
Elf elfSix = new Elf("Seamus", main);
Elf elfSeven = new Elf("Rebecca", main);
Elf elfEight = new Elf("Orla", main);
Elf elfNine = new Elf("Tina", main);
Elf elfTen = new Elf("Filly", main);
Elf elfEleven = new Elf("Jess", main);
...
elfOne.start();
elfTwo.start();
elfThree.start();
elfFour.start();
elfFive.start();
elfSix.start();
elfSeven.start();
elfEight.start();
elfNine.start();
elfTen.start();
elfEleven.start();
}
и мой Elf класс выглядит следующим образом:
public class Elf extends Thread{
Semaphore semaphore = new Semaphore(11);
Random rng = new Random();
String name;
Main main;
public Elf(String name, Main main){
this.name = name;
this.main = main;
}
public void run(){
while(true){
try {
semaphore.acquire();
makeToy();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}
}
private void makeToy() throws InterruptedException{
if (main.getToyList() != 0){
if(rng.nextInt(99) <= 4){ //5% chance to fail
System.out.println(name + " failed in making a toy!");
}else{
main.setToyList(main.getToyList() - 1);
System.out.println(name + " created a toy! Toys remaining: " + main.getToyList());
}
} else {
wakeSanta();
}
}
private void wakeSanta() throws InterruptedException {
}
}
Выходной образец я получаю:
...
Eamonn created a toy! Toys remaining: 6
Jim created a toy! Toys remaining: 7
Eoin created a toy! Toys remaining: 8
Jess created a toy! Toys remaining: 9
Filly created a toy! Toys remaining: 0
Выход я хотел бы get заключается в том, что он последовательно подсчитывается случайным эльфом от 100 до 0. Является ли это чем-то таким же простым, как получение семафора в неправильном месте или я вообще не понимаю семафоров?
Ресурс вы пытаетесь защитить это внутр. Если ваше задание специально не потребует, чтобы Семафор или список игрушек впоследствии были преобразованы в другую структуру, использование AtomicInteger также выполнило бы эту работу. Без сложности управления семафором. – Ralf