// Create many threads waiting on a monitor. Interrupt some of them. Do the // others wake up correctly with notify() and/or notifyAll()? import java.util.Vector; class Waiter extends Thread { Object monitor; int thread_num; boolean interrupted = false; boolean notified = false; Waiter (Object monitor, int thread_num) { this.monitor = monitor; this.thread_num = thread_num; } public void run() { synchronized (monitor) { try { monitor.wait(); notified = true; } catch (InterruptedException x) { interrupted = true; } } } } public class Thread_Wait_2 { static Vector threads; static Object monitor = new Object(); static final int NUM_THREADS = 10; public static void main(String args[]) { try { makeThreads (); Thread.sleep(250); // Interrupt a few threads... Waiter i1 = (Waiter) threads.elementAt(3); Waiter i2 = (Waiter) threads.elementAt(4); Waiter i3 = (Waiter) threads.elementAt(9); i1.interrupt(); i2.interrupt(); i3.interrupt(); // Call notify the exact number of times required to wake the remaining // threads. synchronized (monitor) { for (int i=0; i < NUM_THREADS -3 ; i++) { monitor.notify (); } } joinAll(); printStatus(); // Repeat all the above, but use notifyAll() instead. makeThreads(); Thread.sleep(250); // Interrupt a few threads... i1 = (Waiter) threads.elementAt(0); i2 = (Waiter) threads.elementAt(1); i3 = (Waiter) threads.elementAt(9); i1.interrupt(); i2.interrupt(); i3.interrupt(); // Call notifyAll to wake the remaining threads. synchronized (monitor) { monitor.notifyAll (); } joinAll(); printStatus(); } catch (InterruptedException x) { System.out.println (x); } } static void makeThreads() { threads = new Vector(NUM_THREADS); for (int i=0; i < NUM_THREADS; i++) { Waiter w = new Waiter(monitor, i); w.start(); threads.addElement(w); } } static void joinAll() { try { for (int i=0; i < threads.size(); i++) { Thread t = (Thread) threads.elementAt(i); t.join(); } } catch (InterruptedException x) {} } static void printStatus() { for (int i=0; i < threads.size(); i++) { Waiter w = (Waiter) threads.elementAt(i); if (w.interrupted) System.out.println (i + " interrupted."); if (w.notified) System.out.println (i + " notified."); } } }