在我的主程序中,我启动三个线程,如下所述
主题1: - 具有步骤1A和1B
线程2: - 具有步骤2A和2B
线程3: - 具有步骤3A和3B
我希望线程1,2和3只有在所有线程完成第一步时才继续进行下一步。
例如: - 线程2和线程3分别完成了它们的第一步,即2A和3A,但是Thread1没有完成 完成步骤1A。因此,线程2和3将等到线程1完成步骤1A
我知道我可以使用简单的静态计数器来处理它,并且只有在计数器值为3时才进行。但我相信一定有 在thread / java.util.concurrent包中可以使用搁置的东西吗?
答案 0 :(得分:2)
使用java.util.concurrent.CyclicBarrier。例如,创建一个计数为3的CyclicBarrier
:
CyclicBarrier cb = new CyclicBarrier(3);
new Thread(new Thread1(cb)).start();
new Thread(new Thread2(cb)).start();
new Thread(new Thread3(cb)).start();
class Thread1 implements Runnable() {
private CyclicBarrier barrier;
public Thread1(CyclicBarrier cb) {
barrier = cb;
}
public void run() {
// execute 1A
barrier.await();
// execute 1B
}
class Thread2 implements Runnable() {
private CyclicBarrier barrier;
public Thread2(CyclicBarrier cb) {
barrier = cb;
}
public void run() {
// execute 2A
barrier.await();
// execute 2B
}
// repeat for Thread3
每个线程都会执行,直到达到await()
调用,然后它将停止,直到所有3个线程都到达该集合点。当第三个线程到达该点时(无论哪个),等待的两个线程将继续。