0

In my main programme, i start three threads as described below

Thread 1:- having steps 1A and 1B

Thread 2:- having steps 2A and 2B

Thread 3:- having steps 3A and 3B

I want Thread 1, 2 and 3 proceed for their next step only when all of them complete their first step.

For example:- Thread 2 and Thread 3 have completed their first steps i.e 2A and 3A respectively but Thread1 did not complete step 1A. So thread 2 and 3 will wait till thread 1 complete step 1A

I know i can handle it with simple static counter and only proceed once counter value is 3. But i am sure there must be something off the shelve available in thread/java.util.concurrent package?

M Sach
  • 33,416
  • 76
  • 221
  • 314
  • use the codes under synchronize block for reference: http://tutorials.jenkov.com/java-concurrency/synchronized.html – Rahul Nov 18 '13 at 02:02

1 Answers1

2

Use a java.util.concurrent.CyclicBarrier. For example, create a CyclicBarrier with a count of 3:

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

Each thread will execute until it reach the await() call, then it will stop until all 3 threads have reached that rendezvous point. When the third thread reaches that point (whichever one it is), the two that were waiting will proceed.

brettw
  • 10,664
  • 2
  • 42
  • 59