Mega Code Archive

 
Categories / Java Tutorial / Thread
 

Wait() and notify() must only be issued inside a synchronized block

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();       }     }   } }