【问题标题】:threads did not proceed after barrier.await() using CyclicBarrier使用 CyclicBarrier 在 barrier.await() 之后线程没有继续
【发布时间】:2016-11-04 19:21:07
【问题描述】:

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

【问题讨论】:

  • 旁注:我不认为“马”是Runnable
  • 你是什么意思。如何为每匹马制作一条线?
  • 请你帮我解决这个问题。我已经绞尽脑汁3天了,但我似乎无法找到解决方案。呵呵
  • checknumhorses 在哪里?
  • 我没有在这篇文章中包含它。但是方法 checkNumhorses 只是检查并确保输入是整数。 checkNumhorses 供用户输入马匹数量。

标签: java multithreading thread-synchronization java-threads cyclicbarrier


【解决方案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()

之后,您将障碍分配给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();
       }}

【讨论】:

  • 我按照你说的做了,但是在 await(); 之前我得到了 Nullpointer 异常。
  • list 呢?在启动线程之前,每匹马的 gate 是否都指向 HorseRaceMain 中的 gate 变量?
  • 我尝试在过滤后的list.stream之前和之后打印出马列表。所有马的门都有一个空值。会有什么问题?
  • 感谢 niceman 成功了!!现在我还有一个问题要问。我如何比较每匹马/线的行进距离。比较的原因是要知道哪个是尾马。一旦我知道哪一匹是尾马,我就会像助推器一样提高它的速度。
  • @javako 你有这行:int hop=hop();,你可以在 Horse 类中添加一个hops 字段,在上一行之后你放hops+=hop,你可以比较 hops 字段作为距离旅行
猜你喜欢
  • 2020-08-11
  • 2019-07-22
  • 2019-09-21
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 2011-06-20
相关资源
最近更新 更多