|  | @@ -0,0 +1,64 @@
 | 
	
		
			
				|  |  | +import java.util.concurrent.locks.*;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +public class TestAwaitAndSignal {
 | 
	
		
			
				|  |  | +    public static void main(String[] args) {
 | 
	
		
			
				|  |  | +        Lock lock = new ReentrantLock();
 | 
	
		
			
				|  |  | +        Condition c1 = lock.newCondition();
 | 
	
		
			
				|  |  | +        Condition c2 = lock.newCondition();
 | 
	
		
			
				|  |  | +        Condition c3 = lock.newCondition();
 | 
	
		
			
				|  |  | +        AwaitThread t1 = new AwaitThread(lock, c1, c2, 1, 3, 50, true);
 | 
	
		
			
				|  |  | +        AwaitThread t2 = new AwaitThread(lock, c2, c3, 2, 3, 50, false);
 | 
	
		
			
				|  |  | +        AwaitThread t3 = new AwaitThread(lock, c3, c1, 3, 3, 50, false);
 | 
	
		
			
				|  |  | +        t1.start();
 | 
	
		
			
				|  |  | +        t2.start();
 | 
	
		
			
				|  |  | +        t3.start();
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            Thread.sleep(60);
 | 
	
		
			
				|  |  | +            lock.lock();
 | 
	
		
			
				|  |  | +            c1.signal();
 | 
	
		
			
				|  |  | +        } catch (Exception e) {
 | 
	
		
			
				|  |  | +            e.printStackTrace();
 | 
	
		
			
				|  |  | +        } finally {
 | 
	
		
			
				|  |  | +            lock.unlock();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class AwaitThread extends Thread {
 | 
	
		
			
				|  |  | +    Lock lock;
 | 
	
		
			
				|  |  | +    Condition curr;
 | 
	
		
			
				|  |  | +    Condition next;
 | 
	
		
			
				|  |  | +    int init;
 | 
	
		
			
				|  |  | +    int delta;
 | 
	
		
			
				|  |  | +    int count;
 | 
	
		
			
				|  |  | +    boolean first;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    AwaitThread(Lock lock, Condition curr, Condition next, int init, int delta, int count, boolean first) {
 | 
	
		
			
				|  |  | +        this.lock = lock;
 | 
	
		
			
				|  |  | +        this.curr = curr;
 | 
	
		
			
				|  |  | +        this.next = next;
 | 
	
		
			
				|  |  | +        this.init = init;
 | 
	
		
			
				|  |  | +        this.delta = delta;
 | 
	
		
			
				|  |  | +        this.count = count;
 | 
	
		
			
				|  |  | +        this.first = first;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void run() {
 | 
	
		
			
				|  |  | +        System.out.println("Thread " + init + " is running.");
 | 
	
		
			
				|  |  | +        for (int i = 0, num = init; i < count; i++) {
 | 
	
		
			
				|  |  | +            lock.lock();
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                curr.await();
 | 
	
		
			
				|  |  | +                System.out.println(num);
 | 
	
		
			
				|  |  | +                num += delta;
 | 
	
		
			
				|  |  | +                Thread.sleep(5);
 | 
	
		
			
				|  |  | +                next.signal();
 | 
	
		
			
				|  |  | +            } catch (Exception e) {
 | 
	
		
			
				|  |  | +                e.printStackTrace();
 | 
	
		
			
				|  |  | +            } finally {
 | 
	
		
			
				|  |  | +                lock.unlock();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |