在三个不同的线程中同步三个步骤?

时间:2013-11-18 02:01:06

标签: java multithreading synchronization java.util.concurrent

在我的主程序中,我启动三个线程,如下所述

主题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包中可以使用搁置的东西吗?

1 个答案:

答案 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个线程都到达该集合点。当第三个线程到达该点时(无论哪个),等待的两个线程将继续。