Java tutorial
import java.util.LinkedList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> stack = new LinkedList<Integer>(); Producer producer = new Producer(stack); Consumer consumer = new Consumer(stack); producer.start(); consumer.start(); } } class Producer extends Thread { public Producer(List<Integer> s) { mStack = s; } List<Integer> mStack = null; int mNumber = 0; @Override public void run() { while (true) { synchronized (mStack) { while (!mStack.isEmpty()) { try { mStack.wait(); // this.wait(); } catch (Exception e) { e.printStackTrace(); } } mNumber++; System.out.println("Producer generates number:" + mNumber); mStack.add(mNumber); mStack.notifyAll();// this.notifyAll(); } } } } class Consumer extends Thread { public Consumer(List<Integer> s) { mStack = s; } List<Integer> mStack = null; @Override public void run() { while (true) { synchronized (mStack) { while (mStack.isEmpty()) { try { mStack.wait(); // this.wait(); } catch (Exception e) { e.printStackTrace(); } } int number = ((LinkedList<Integer>) mStack).removeLast(); System.out.println("Consumer consumes number:" + number); mStack.notifyAll();// this.notifyAll(); } } } }