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