1

请帮我处理我的代码。我正在使用比赛起点和终点线有 2 个点进行比赛。所有的马都从大门口出发,向大门口前进。比赛只有在所有马匹都到达大门后才开始。最先完成的人赢得比赛。

4

1 回答 1

1

您的错误是您在此处提供的号码

gate= new CyclicBarrier(numHorses);

什么是 numHorses ?

这是所有马匹的数量,但在这里:

list.removeIf(...);

您正在移除 18 岁以下的马匹,假装我们总共有 5 匹马,numHorses==5这是真的,其中 2 匹未满 18 岁,所以我们只剩下 3 匹。

您正在创建三个线程,但屏障设置为 5,屏障将永远不会通过,因为当只有三个线程时它正在等待 5 个线程。

解决方案是在addHorsesToList没有障碍的情况下添加马(所以你也需要一个Horse没有障碍的构造函数),然后你移动gate = new CyclicBarrier到之后list.removeIf并更改numHorseslist.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();
       }}
于 2016-07-02T15:44:35.123 回答