Java tutorial
public class WaitComm { public static void main(String args[]) { WFlagSend s = new WFlagSend(); WFlagRec r = new WFlagRec(s); Thread st = new Thread(s); Thread rt = new Thread(r); rt.setDaemon(true); st.start(); rt.start(); try { st.join(); while (s.isValid) { Thread.sleep(100); } } catch (InterruptedException e) { e.printStackTrace(); } } } class WFlagSend implements Runnable { volatile int theValue; boolean isValid; public void run() { for (int i = 0; i < 5; i++) { synchronized (this) { while (isValid) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } theValue = (int) (Math.random() * 256); System.out.println("sending " + theValue); synchronized (this) { isValid = true; this.notify(); } } } } class WFlagRec implements Runnable { WFlagSend theSender; public WFlagRec(WFlagSend sender) { theSender = sender; } public void run() { while (true) { synchronized (theSender) { while (!theSender.isValid) { try { theSender.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println("received " + theSender.theValue); synchronized (theSender) { theSender.isValid = false; theSender.notify(); } } } }