最近我学习了CyclicBarrier,但这是一个问题:
代码:
public class Main {
public static CyclicBarrier c;
public static void main(String[] agrs){
int threadsCount = 5;
c = new CyclicBarrier(threadsCount + 1);
// make 5 A threads to run
}
}
public class A implements Runnable {
public void run(){
// do something
Main.c.await();
// do something
}
}
在大约代码中,我想知道为什么我必须通过(threadsCount + 1)而不是(threadsCount)初始化CyclicBarrier,因为我从不在main方法中调用await()?
答案 0 :(得分:0)
n
是new CyclicBarrier(n)
创建新的CyclicBarrier的聚会数量,当给定数量的聚会(线程)等待它时它将跳闸,并且不对每个障碍执行预定义的操作
我认为原始线程被视为访问障碍,因此当您创建5个新线程时,如果您没有等待5+1
个线程,那么您在准备好之前就会跳闸。
答案 1 :(得分:0)
您必须指定将在CyclicBarrier
上等待的确切参与方数,如果您指定n + 1,则必须有n + 1个线程按顺序在CyclicBarrier
上调用等待为了它的旅行。