请帮我处理我的代码。我正在使用比赛起点和终点线有 2 个点进行比赛。所有的马都从大门口出发,向大门口前进。比赛只有在所有马匹都到达大门后才开始。最先完成的人赢得比赛。
问问题
245 次
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
并更改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();
}}
于 2016-07-02T15:44:35.123 回答