你不想鎖,但障礙:m(n + 1)必須等到m(n)被調用。下面的代碼假設只有一個序列或方法調用(並且m1/2/3從不同的線程中調用,或者在同一線程中按照正確的順序調用,否則您將永遠等待鎖存器)。如果它可能發生多次,它需要重置(或者您可能會喜歡Phaser)。
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)
}
然而,這是有點不可思議的設計,因爲你想這樣做的順序,你應該只是做的所有工作中的輸出方法,它等待,直到所有的輸入是英寸
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
}
你只需要m1,m2,m3和m4按順序執行,每個等待前一個?只要做到: m1(); m2(); m3(); m4(); 雖然我猜你想要稍微不同的事情發生。你能解釋我上面寫的是不是做你想做的? –
我不知道爲什麼,但這種回憶我Observer模式... – davioooh
我不明白這一點,如果他們彼此等待,只需一個接一個地執行。 – nyyrikki