Потоки не продолжались после барьера.await() с использованием CyclicBarrier
Пожалуйста, помогите мне с моим кодом. Я делаю гонку, используя 2 очка в начальной точке гонки и на финише. Все лошади стартовали у ворот и проследовали к воротам. Гонка начинается только после того, как все лошади достигли ворот. Тот, кто финишировал первым, побеждает в гонке.
1 ответ
Ошибка у вас есть номер, который вы предоставляете здесь
gate= new CyclicBarrier(numHorses);
Что такое numHorses?
Это число всех лошадей, но здесь:
list.removeIf(...);
Вы удаляете лошадей до 18 лет, представьте, что у нас было всего 5 лошадей, numHorses==5
верно, два из них моложе 18 лет, поэтому у нас осталось 3.
Вы создаете три потока, но барьер установлен на 5, барьер никогда не пройдет, потому что он ждет 5 потоков, когда их всего три.
Решение состоит в том, чтобы сделать addHorsesToList
добавить лошадей без барьера (так что вам понадобится Horse
конструктор без барьера тоже), то вы двигаетесь gate = new CyclicBarrier
после list.removeIf
и изменить numHorses
в list.size()
,
После этого вы назначаете барьер gate
поле каждого объекта лошади в list
,
Делай так:
int canJoin=0;
while(canJoin<2){
list= new ArrayList<Horse>();
numHorses=checkNumHorses();
addHorsesToList();
printHorses();
canJoin=countJoinAge();
}
list.removeIf(p -> p.Age().equals(18));
int numHealthyHorses=list.size();
gate=new CyclicBarrier(numHealthyHorses);
System.out.println("Horses who can join");
Thread[] threads = new Thread[numHealthyHorses];
for(Horse horse: list){ //create thread for each Horse
horse.setGateBarrier(gate); //setter method, needs to be added to Horse class
threads[numThread]= new Thread(horse);
}
for(int i=0;i<numHealthyHorses;i++){ //start the thread for each horse
threads[i].start();
}}