请帮我解决我的代码。我正在使用 比赛有起点和终点2个点。所有的马匹都从城门出发,向城门行进。只有当所有马匹都到达门口时,比赛才会开始。第一个完成比赛的人赢得了比赛。
最佳答案
您的错误是您在此处提供的号码
gate= new CyclicBarrier(numHorses);
什么是 numHorses ?
这是所有马的数量,但这里:
list.removeIf(...);
您要删除 18 岁以下的马,假设我们总共有 5 匹马,numHorses==5
为 true,其中两匹未满 18 岁,所以我们只剩下 3 匹。
您正在创建三个线程,但屏障设置为 5,屏障永远不会被通过,因为当只有三个线程时,它正在等待 5 个线程。
解决方案是让 addHorsesToList
添加没有障碍的马(所以你也需要一个没有障碍的 Horse
构造函数),然后移动 gate =在
并将 list.removeIf
之后添加新的 CyclicBarriernumHorses
更改为 list.size()
。
之后,将障碍分配给 list
中每个马对象的 gate
字段。
这样做:
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();
}}
关于java - 使用 CyclicBarrier 的 Barrier.await() 之后线程没有继续进行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38161345/