Java Thread How to - Manage order of threads with CyclicBarrier








Question

We would like to know how to manage order of threads with CyclicBarrier.

Answer

import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/*from w ww  . ja va 2  s  .c om*/
public class Main {
  public static void main(String[] args) {
    List<Task> tasks = new LinkedList<Task>();
    String[] tasksLabels = new String[] { "A", "B", "C" };
    Clock clock = new Clock(tasksLabels.length, new Counter());
    for (String s : tasksLabels) {
      Task task = new Task(s, clock);
      tasks.add(task);
      task.start();
    }
  }
}
class Counter implements Runnable {
  volatile int step = 0;
  @Override
  public void run() {
    step++;
  }

  public int getStep() {
    return step;
  }
}
class Clock extends CyclicBarrier {
  Counter counter;
  public Clock(int parties, Counter counter) {
    super(parties, counter);
    this.counter = counter;
  }
  int getStep() {
    return counter.getStep();
  }
}
class Task extends Thread {
  String name;
  Clock clock;
  boolean running = true;
  Random random = new Random();
  Task(String name, Clock clock) {
    this.clock = clock;
    this.name = name;
  }
  boolean checkStep(int step) {
    return true;
  }
  @Override
  public void run() {
    while (running) {
      try {
        doIt(clock.getStep());
        clock.await();
      } catch (InterruptedException e) {
        running = false;
        e.printStackTrace();
      } catch (BrokenBarrierException e) {
        running = false;
        e.printStackTrace();
      }
    }
  }
  public void doIt(int step) throws InterruptedException {
    System.out.println(name + ": step " + step);
    // Simulate a busy task
    Thread.sleep(random.nextInt(1000));
  }
}

The code above generates the following result.