ロックは必要ありませんが、バリア:m(n + 1)は、m(n)が呼び出されるまで待機する必要があります。以下のコードは、シーケンスまたはメソッドの呼び出しが1つしかないことを前提としています(m1 / 2/3は、異なるスレッドから、または同じスレッドで適切なシーケンスで呼び出されます。そうしないと、ラッチで永久に待機します)。それが複数回発生する可能性がある場合は、リセットする必要があります(または、フェイザーを使いこなすことができます)。
private CountDownLatch m2latch = new CountDownLatch(1);
private CountDownLatch m3latch = new CountDownLatch(1);
public void m1() {
// handle input
m2latch.countDown();
}
public void m2() {
m2latch.await();
// handle input (m1 has been called)
m3latch.countDown();
}
public void m3() {
m3latch.await();
// do output (both m1 + m2 have been called)
}
ただし、これは少し奇妙な設計です。順番に実行したいので、すべての入力が入力されるまで待機するoutputメソッドですべての作業を実行する必要があります。
private CountDownLatch inputLatch = new CountDownLatch(3);
private Object[] input = new Object[3];
public void setInput(int i, Object data) {
input[i] = data;
inputLatch.countDown(); // perhaps better check all input set
}
public Object processInput() {
inputLatch.await();
return process(input); // process in sequence
}