Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Note that when thread 2 goes into wait, the condition predicate of thread 1 has become false. When notify() is invoked by thread 3, it can be delivered to either thread 1 or thread 2 depending on the JVM. If thread 1 is chosen, it's condition turns out to be false. Even though this notify was meant for thread 2 (whose condition is on the other hand, true) thread 1 wakes up on its false condition.

Code Block
bgColor#FFcccc
import java.util.LinkedList;
import java.io.IOException;

public class MissedSignal implements Runnable{
  private static LinkedList list = new LinkedList();
  private static int buffer_count = 5;
  private int number;      //selects function based on thread number	
        
  public MissedSignal(int number) {
    this.number = number;
  }
        
  public  void run (){
    synchronized(list) {
      try {
            if(number == 1) {	  
              System.out.println("Thread 1 started..."); 
              while(buffer_count == 0) { 
      	        System.out.println("Beginning wait() Thread 1...");	
      	        list.wait();		  
      	        System.out.println("Thread 1 got notified this time...");
      	    }  
      	    System.out.println("Exiting because Thread 1 condition is false...");	
      	  }  
      	  else if(number == 2) {  	    		  
      	    System.out.println("Thread 2...");
      	    while(buffer_count > 0) {	
      	      System.out.println("Beginning wait() Thread 2...");	
      	      list.wait();   	    		    	  
      	      System.out.println("Thread 2 got notified this time...");
      	    }
      	    System.out.println("Exiting because the thread 2 condition is false...");
      	  }
      	  else if(number == 3) {
      	    Thread.sleep(2000);	   		    			   
            list.notify();      	   		  
          } 	    	  
      }catch (InterruptedException ie) {ie.printStackTrace(); }
    }	  
  }

  public static void makeThread1True() {
    buffer_count = 0;
  }
        
  public static void makeThread2True() {
    buffer_count = 10;
  }
        
  public static void main(String[] args) throws IOException {
    makeThread1True();
    Runnable runnable1 = new MissedSignal(1);
    Thread t1 = new Thread(runnable1);
    t1.start();
  		  
    try {
  	  new Thread().sleep(5000);
	  makeThread2True();
    } catch (InterruptedException e) { e.printStackTrace(); }
  		   
    Runnable runnable2 = new MissedSignal(2);
    Thread t2 = new Thread(runnable2);
    t2.start();
  		  
    Runnable runnable3 = new MissedSignal(3);
    Thread t3 = new Thread(runnable3);
    t3.start();
  }
}

...