package japan.example.test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
public static void main(String[] args) throws Exception {
CyclicBarrierTest test = new CyclicBarrierTest();
test.test();
}
public void test() throws InterruptedException {
int[][] data = new int[][] { //
{ 1, 2, 3, 4 }, //
{ 5, 6, 7, 8 }, //
{ 9, 10, 11, 12 }, //
{ 13, 14, 15, 16 } //
};
Solver solver = new Solver(data);
}
}
class Solver {
final int N;
final int[][] data;
final CyclicBarrier barrier;
class Worker implements Runnable {
int myRow;
Worker(int row) {
myRow = row;
}
public boolean done() {
return false;
}
public void processRow(int myRow) {
System.err.println("process " + myRow);
}
public void run() {
while (!done()) {
processRow(myRow);
try {
barrier.await();
} catch (InterruptedException ex) {
return;
} catch (BrokenBarrierException ex) {
return;
}
}
}
}
public Solver(int[][] matrix) throws InterruptedException {
data = matrix;
N = matrix.length;
Runnable barrierAction = new Runnable() {
@Override
public void run() {
System.err.println("run");
}
};
barrier = new CyclicBarrier(N, barrierAction);
List<Thread> threads = new ArrayList<>(N);
for (int i = 0; i < N; i++) {
Thread thread = new Thread(new Worker(i));
threads.add(thread);
thread.start();
}
// wait until done
for (Thread thread : threads)
thread.join();
}
}