guarantee that threads are woken in the same order in which they waited : synchronized « Thread « Java Tutorial






import java.util.Vector;

public class Wake {
  private Vector<Object> stopped = new Vector<Object>();

  public void stopOne() {
    Object myLock = new Object();
    synchronized (myLock) {
      stopped.addElement(myLock);
      try {
        myLock.wait();
      } catch (InterruptedException e) {
      }
    }
  }

  public void wakeOne() {
    Object theLock = null;
    synchronized (stopped) {
      if (stopped.size() != 0) {
        theLock = stopped.firstElement();
        stopped.removeElementAt(0);
      }
    }
    if (theLock != null) {
      synchronized (theLock) {
        theLock.notify();
      }
    }
  }

  public static void main(String args[]) {
    Wake queue = new Wake();
    Runnable r = new RunThis(queue);
    Thread t;
    for (int i = 0; i < 10; i++) {
      t = new Thread(r);
      t.start();
    }

    for (int i = 0; i < 11; i++) {
      try {
        Thread.sleep((long) (Math.random() * 1000));
      } catch (InterruptedException e) {
      }
      System.out.println("About to wake one thread");
      queue.wakeOne();
    }
  }
}

class RunThis implements Runnable {
  Wake w;

  public RunThis(Wake w) {
    this.w = w;
  }

  public void run() {
    System.out.println("Thread starting, name is " + Thread.currentThread().getName());
    w.stopOne();
    System.out.println("Thread woken up, name is " + Thread.currentThread().getName());
  }
}








10.11.synchronized
10.11.1.Test Synchronized method
10.11.2.Test Unsynchronized method
10.11.3.This program is not synchronized.
10.11.4.This program uses a synchronized block.
10.11.5.Flag Communication
10.11.6.Waiting on an object
10.11.7.wait() and notify() must only be issued inside a synchronized block
10.11.8.guarantee that threads are woken in the same order in which they waited
10.11.9.creating a piped communications system between two threads.
10.11.10.Handle concurrent read/write: use synchronized to lock the data
10.11.11.A synchronized collection with Collections.synchronizedCollection
10.11.12.Determining If the Current Thread Is Holding a Synchronized Lock