import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
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));
}
}
運(yùn)行結(jié)果如下: