【发布时间】:2016-10-08 08:34:59
【问题描述】:
我正在尝试通过在启动(等待)少数方(线程)中间重置循环障碍来测试 BrokenBarrierException,请查找以下示例代码。
用户类别:
public class User implements Runnable {
private final String name;
private final CyclicBarrier cb;
public User(String name, CyclicBarrier cb) {
this.name = name;
this.cb = cb;
}
@Override
public void run() {
System.out.println(name+" user started !!!! ");
try {
cb.await();
} catch (InterruptedException | BrokenBarrierException e) {
System.out.println(e);
e.printStackTrace();
}
}
}
CyclicBarrierTest 类:
public class CyclicBarrierTest {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(5);
User user1 = new User("USER1", barrier);
new Thread(user1).start();
User user2 = new User("USER2", barrier);
new Thread(user2).start();
//Expected users are 5, but only 2 user threads started so far
// and resetting below which should throw barrier broken exception
barrier.reset();
if(barrier.isBroken()) {
System.out.println("Barrier broken ");
}
}
}
所以,在运行上面的 main() 之后,我可能会遇到任何异常,而且“Barrier broken”也没有打印出来。线程只是在等待。
我在下面的链接中提到了 CyclicBarrier API:
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html
公共无效重置():
将屏障重置为其初始状态。如果有的话 各方目前正在屏障处等待,他们将返回 BrokenBarrierException。
但是根据 API 描述,我上面的代码似乎不起作用,那么上面的代码有什么问题,为什么它没有抛出 BrokenBarrierException ?
你能帮忙吗?
【问题讨论】:
标签: java multithreading