CountDownLatch
Bloch の Item 69(Effective Java) を読みましたが、同期スレッドに3 を使用するタイミング実行用のシンプルなフレームワークの例がありました。また、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();
this( ) 命令が別のスレッドの開始前に実行されるという保証はありません。
CyclicBarrier でそのような機能を実現するにはどうすればよいですか? 助言がありますか?