01: /**
02:    This gate makes a thread wait until another
03:    thread opens the gate.
04: */
05: public class Gate
06: {
07:    /**
08:       Checks whether the gate is active. An inactive
09:       gate does not cause a thread to wait.
10:       @return true if this gate is active
11:    */
12:    public boolean isActive()
13:    {
14:       return active;
15:    }
16: 
17:    /**
18:       Activates or deactivates this gate.
19:       @param newValue true to activate, false to deactivate
20:    */
21:    public synchronized void setActive(boolean newValue)
22:    {
23:       active = newValue;
24:       notifyAll();
25:    }
26: 
27:    /**
28:       Opens or closes this gate. An open gate allows
29:       waiting threads to proceed.
30:       @param newValue true to open, false to close
31:    */
32:    public synchronized void setOpen(boolean newValue)
33:    {
34:       active = true;
35:       opened = newValue;
36:       notifyAll();
37:    }
38: 
39:    /**
40:       Waits for this gate to open, and closes it again
41:       after the gate has been opened.
42:    */
43:    public synchronized void waitForOpen() 
44:       throws InterruptedException
45:    {
46:       while (active && !opened)
47:          wait();
48:       opened = false;
49:    }
50: 
51:    private boolean active;
52:    private boolean opened;
53: }