Потоки не продолжались после барьера.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();
       }}
Другие вопросы по тегам