|
@@ -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();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|