// Create two threads waiting on a monitor. Interrupt one of them. Does the // other wake up correctly? 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) { System.out.println ("Thread waiting."); try { long start = System.currentTimeMillis(); monitor.wait(1000); long time = System.currentTimeMillis() - start; if (time > 990) System.out.println ("Error: wait on thread " + thread_num + " timed out."); else notified = true; } catch (InterruptedException x) { interrupted = true; } } } } public class Thread_Wait_Interrupt { public static void main(String args[]) { Object monitor = new Object(); Waiter w1 = new Waiter(monitor, 1); Waiter w2 = new Waiter(monitor, 2); w1.start(); w2.start(); try { Thread.sleep(250); synchronized (monitor) { w1.interrupt(); monitor.notify(); } w1.join(); w2.join(); System.out.println("join ok"); System.out.println("Thread 1 " + (w1.interrupted ? "interrupted ok" : "error")); System.out.println("Thread 2 " + (w2.notified ? "notified ok" : "error")); } catch (InterruptedException x) { System.out.println (x); } } }