public class JoinTest implements Runnable { public static int count = 0; void send() throws Exception { Thread.sleep(2000); System.out.println("PASSED: Sender completed"); } void receive() throws Exception { synchronized(this) { notifyAll(); } Thread.sleep(5000); count++; System.out.println("PASSED: Receiver completed"); } public void run() { String name = Thread.currentThread().getName(); if (name.equals("timer")) { try { Thread.sleep(10000); } catch (InterruptedException e){} System.out.println("FAILED: timer triggered"); System.exit(1); } try { receive(); } catch (Exception e) { System.out.println("FAILED: receiver: " + e); System.exit(1); } } public static void main(String args[]) { try { JoinTest sender = new JoinTest(); JoinTest receiver = new JoinTest(); Thread receiver_thread = new Thread(receiver); /* Make sure the test terminates even if it hangs on network */ JoinTest timer = new JoinTest(); Thread timer_thread = new Thread(timer, "timer"); timer_thread.start(); synchronized(receiver) { receiver_thread.start(); receiver.wait(); } try { sender.send(); } catch (Exception e) { System.out.println("FAILED: sender: " + e); System.exit(1); } receiver_thread.join(); if (0 == count) throw new Exception("Nothing received"); System.out.println("PASSED: Join send/receive count="+count); System.exit(0); } catch (Exception e) { System.out.println("FAILED: " + e); System.exit(1); } } }