我已经阅读了Bloch的第69条(有效的Java),有一个简单的定时执行框架的例子,它使用3个CountDownLatch来同步线程。另外,Bloch说这个例子可以用1个CyclicBarrier重写。我已经尝试过这样做,并获得了下一个代码:
public static long time(ExecutorService exec, int count) throws InterruptedException, BrokenBarrierException {
CyclicBarrier cyclicBarrier = new CyclicBarrier(count+1);
for (int i = 0; i < count; i++) {
exec.submit(new Worker(cyclicBarrier, i));
}
System.out.println("Start processing");
cyclicBarrier.await();
long time = System.nanoTime();
cyclicBarrier.await();
long elapsedTime = (System.nanoTime() - time)/1000;
System.out.println("FIN. ");
return elapsedTime;
}
private static class Worker implements Runnable {
final CyclicBarrier cyclicBarrier;
int workerNumber;
Worker(CyclicBarrier cyclicBarrier, int workerCount) {
this.cyclicBarrier = cyclicBarrier;
this.workerNumber = workerCount;
}
public void run() {
try {
cyclicBarrier.await();
work();
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
private void work() {
System.out.println("Worker " + workerNumber + " starts his job");
System.out.println("Worker " + workerNumber + " finishes his job");
}
}但我认为这里(在time方法中)有一个问题:在第一个await之后,我尝试测量线程开始执行的时间,所以我想在所有其他线程开始之前测量这个时间。不能保证此(long time = System.nanoTime();)指令将在另一个线程启动之前执行。
如何使用CyclicBarrier实现这样的功能?有什么建议吗?
发布于 2012-09-13 16:28:51
CyclicBarrier允许您定义要在所有线程达到屏障之后、恢复执行之前执行的屏障操作。使用CyclicBarrier(int, Runnable)来定义它。
显然,在您的情况下,需要区分执行屏障操作之前和完成它之后,就像这样:
class TimingAction implements Runnable {
private boolean running;
private long start;
private long elapsed;
public void run() {
if (running) {
elapsed = System.nanoTime() - start;
running = false;
} else {
start = System.nanoTime();
running = true;
}
}
...
}
TimingAction timer = new TimingAction();
CyclicBarrier cyclicBarrier = new CyclicBarrier(count + 1, timer);
...
long elapsed = timer.getElapsed();https://stackoverflow.com/questions/12400922
复制相似问题