Simple test of notify, notifyAll, wait, synchronize

Previous      Next      Test1b.java      TestFrame.java      Sister code      Home

// Simple test of notify, notifyAll, wait, synchronize.  The Monitor
// allows W1 objects to wait (via method 'a') until awakened by an N1 object
// (via method 'b').  Control portion of code is Threaded.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.applet.*;

// A Monitor for W (for waiting) objects
class M1 {
   boolean flag;
   TestFrame test;
   
   public M1 (boolean flag, TestFrame tst) {  this.flag = flag; test = tst; }

   synchronized public void a () {
      test.text.append("a: wait ("+((W1)Thread.currentThread()).numb+")\n");
      try { wait(); } catch (Exception e) {}
      test.text.append("a: rise ("+((W1)Thread.currentThread()).numb+")\n");
   }

   synchronized public void b () {
      test.text.append("b: notify ("+((N1)Thread.currentThread()).numb+")\n");
      if (flag) notify(); else notifyAll();
      test.text.append("b: done ("+((N1)Thread.currentThread()).numb+")\n");
   }
}

class N1 extends Thread {
   M1 monitor;
   int numb;

   public N1 (int n, M1 mn) {  monitor = mn;  numb = n;  }

   public void run () {
      monitor.test.text.append("N1: Starting ("+numb+")\n");
      monitor.b();
      monitor.test.text.append("N1: Finishing ("+numb+")\n");
   }
}

class W1 extends Thread {
   M1 monitor;
   int numb;

   public W1 (int n, M1 mn) { monitor = mn;  numb = n; }

   public void run () {
      monitor.test.text.append("W1: Starting ("+numb+")\n");
      monitor.a();
      monitor.test.text.append("W1: Finishing ("+numb+")\n");
   }
}

class Test1Doer extends Thread {
   TestFrame f;

   public Test1Doer (TestFrame f) { this.f = f; }

   public void run () {
      boolean flag;
      f.text.setText("");
      try { sleep(200); } catch (Exception e) { }

      try {
	 if (f.choice.getSelectedItem().equals("notifyAll")) {
	    flag = false;
	    f.text.append("\nnotifyAll() -\n");
	 } else {
	    flag = true;
	    f.text.append("\nnotify() -\n");				
	 }
	 
	 M1 monitor = new M1 (flag, f);
	 W1 w1 = new W1 (1, monitor);
	 W1 w2 = new W1 (2, monitor);
	 W1 w3 = new W1 (3, monitor);
	 N1 n1 = new N1 (99, monitor);
	 w1.start();
	 w2.start();
	 w3.start();
	 n1.start();
      } catch (Exception e) { }
   }
}

class Test1bFrame extends TestFrame {
   public Test1bFrame () {
      super();
      setLayout(new BorderLayout());
      JPanel p = new JPanel();
      p.setLayout(new GridLayout(1,2));
      p.add(choice = new JComboBox());
      p.add(button);
      choice.addItem("notify");
      choice.addItem("notifyAll");
      add("South",p);
      add("Center", new JScrollPane(text));
   }
	
   public void actionPerformed (ActionEvent evt) {
      (new Test1Doer(this)).start();
   }
}

public class Test1b extends Applet {
   public void init () {
      TestFrame test1 = new Test1bFrame();
      test1.setSize(300,600);
      test1.setVisible(true);
   }
}