你不想锁,但障碍: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