package me.brandonc.benchmark;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import me.brandonc.benchmark.exception.OperationException;
public class Worker<T> implements Runnable {
private final CyclicBarrier barrier;
private final int begin;
private final int end;
private final Action<T> action;
private final Context<T> context;
public Worker(int begin, int end, Context<T> context, Action<T> action, CyclicBarrier barrier) {
this.begin = begin;
this.end = end;
this.context = context;
this.action = action;
this.barrier = barrier;
}
public void run() {
callAwait();
try {
action.setup(context);
for (int id = begin; id < end; id++) {
action.execute(context, id);
}
action.teardown(context);
} finally {
callAwait();
}
}
public void callAwait() {
try {
barrier.await();
} catch (InterruptedException e) {
throw new OperationException(e);
} catch (BrokenBarrierException e) {
throw new OperationException(e);
}
}
}