java - 使用 CyclicBarrier 的 Barrier.await() 之后线程没有继续进行

标签 java multithreading thread-synchronization java-threads cyclicbarrier

请帮我解决我的代码。我正在使用 比赛有起点和终点2个点。所有的马匹都从城门出发,向城门行进。只有当所有马匹都到达门口时,比赛才会开始。第一个完成比赛的人赢得了比赛。

最佳答案

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

gate= new CyclicBarrier(numHorses);

什么是 numHorses ?

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

list.removeIf(...);

您要删除 18 岁以下的马,假设我们总共有 5 匹马,numHorses==5 为 true,其中两匹未满 18 岁,所以我们只剩下 3 匹。

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

解决方案是让 addHorsesToList 添加没有障碍的马(所以你也需要一个没有障碍的 Horse 构造函数),然后移动 gate =在 list.removeIf 之后添加新的 CyclicBarrier 并将 numHorses 更改为 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/

相关文章:

java - ConcurrentHashMap 上的元素循环

java - 如何在java中更新图形?

java - Spring简介页面的困境

c++ - WriteFile 返回错误代码 995

ios - 设置CoreData NSManagedObjectContext线程优先级

c++ - 比较和交换与测试和设置

java - 对于以下简单的 Java 代码,同步不起作用

java - AWS如何从Java为特定IAM用户创建CMK key

Java:用drawLine绘制矩形螺旋线

ios - 在后台线程中使用 Couchbase