在使用CyclicBarrier的barrier.await()之后,线程没有继续

时间:2016-07-02 14:47:14

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

请帮我处理我的代码。我正在参加比赛 比赛起点和终点线有2个点。所有的马都从大门开始,然后前往大门。只有所有的马到达大门后,比赛才会开始。首先获胜的人将赢得比赛。

1 个答案:

答案 0 :(得分:1)

你遇到的错误就是你在这里提供的号码

gate= new CyclicBarrier(numHorses);

什么是numHorses?

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

list.removeIf(...);

你正在移除18岁以下的马匹,假装我们总共有5匹马,numHorses==5是真的,其中两个不到18岁,所以我们留下了3匹。

你创建了三个线程,但是屏障设置为5,屏障永远不会被传递,因为当只有三个线程时它会等待5个线程。

解决方法是让addHorsesToList在没有障碍的情况下添加马匹(因此您需要一个没有障碍的Horse构造函数),然后将gate = new CyclicBarrier移到{{1}之后并将list.removeIf更改为numHorses

之后,您将屏障分配给list.size()中每个马对象的gate字段。

这样做:

list