1 // Create many threads waiting on a monitor. Interrupt some of them. Do the 2 // others wake up correctly with notify() and/or notifyAll()? 3 4 import java.util.Vector; 5 6 class Waiter extends Thread 7 { 8 Object monitor; 9 int thread_num; 10 boolean interrupted = false; 11 boolean notified = false; 12 Waiter(Object monitor, int thread_num)13 Waiter (Object monitor, int thread_num) 14 { 15 this.monitor = monitor; 16 this.thread_num = thread_num; 17 } 18 run()19 public void run() 20 { 21 synchronized (monitor) 22 { 23 try 24 { 25 monitor.wait(); 26 notified = true; 27 } 28 catch (InterruptedException x) 29 { 30 interrupted = true; 31 } 32 } 33 34 } 35 } 36 37 public class Thread_Wait_2 38 { 39 static Vector threads; 40 static Object monitor = new Object(); 41 42 static final int NUM_THREADS = 10; 43 main(String args[])44 public static void main(String args[]) 45 { 46 47 48 try 49 { 50 makeThreads (); 51 52 Thread.sleep(250); 53 54 // Interrupt a few threads... 55 Waiter i1 = (Waiter) threads.elementAt(3); 56 Waiter i2 = (Waiter) threads.elementAt(4); 57 Waiter i3 = (Waiter) threads.elementAt(9); 58 i1.interrupt(); 59 i2.interrupt(); 60 i3.interrupt(); 61 62 // Call notify the exact number of times required to wake the remaining 63 // threads. 64 synchronized (monitor) 65 { 66 for (int i=0; i < NUM_THREADS -3 ; i++) 67 { 68 monitor.notify (); 69 } 70 } 71 72 joinAll(); 73 printStatus(); 74 75 // Repeat all the above, but use notifyAll() instead. 76 makeThreads(); 77 78 Thread.sleep(250); 79 80 // Interrupt a few threads... 81 i1 = (Waiter) threads.elementAt(0); 82 i2 = (Waiter) threads.elementAt(1); 83 i3 = (Waiter) threads.elementAt(9); 84 i1.interrupt(); 85 i2.interrupt(); 86 i3.interrupt(); 87 88 // Call notifyAll to wake the remaining threads. 89 synchronized (monitor) 90 { 91 monitor.notifyAll (); 92 } 93 94 joinAll(); 95 printStatus(); 96 97 } 98 catch (InterruptedException x) 99 { 100 System.out.println (x); 101 } 102 103 104 } 105 makeThreads()106 static void makeThreads() 107 { 108 threads = new Vector(NUM_THREADS); 109 110 for (int i=0; i < NUM_THREADS; i++) 111 { 112 Waiter w = new Waiter(monitor, i); 113 w.start(); 114 threads.addElement(w); 115 } 116 } 117 joinAll()118 static void joinAll() 119 { 120 try 121 { 122 for (int i=0; i < threads.size(); i++) 123 { 124 Thread t = (Thread) threads.elementAt(i); 125 t.join(); 126 } 127 } 128 catch (InterruptedException x) {} 129 } 130 printStatus()131 static void printStatus() 132 { 133 for (int i=0; i < threads.size(); i++) 134 { 135 Waiter w = (Waiter) threads.elementAt(i); 136 if (w.interrupted) 137 System.out.println (i + " interrupted."); 138 if (w.notified) 139 System.out.println (i + " notified."); 140 } 141 } 142 143 } 144