public class ProducerConsumer { public static void main(String[] args) { ProductBox pb = new ProductBox(); Producer p = new Producer(pb); Consumer c = new Consumer(pb); Thread pThread = new Thread(p); Thread cThread = new Thread(c); pThread.setPriority(Thread.MAX_PRIORITY); cThread.setPriority(Thread.MIN_PRIORITY); pThread.setName("Producer"); cThread.setName("Consumer"); pThread.start(); cThread.start(); } } class Product { int id; public Product(int id) { super(); this.id = id; } public String toString() { return "Product:" + id; } } class ProductBox { Product[] productbox = new Product[6]; int index = 0; public ProductBox() { super(); } public synchronized void push(Product p) { while (index == productbox.length) { try { System.out.println(Thread.currentThread().getName() + ".push()"); this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notify(); productbox[index] = p; index++; } public synchronized Product pop() { while (index == 0) { try { System.out.println(Thread.currentThread().getName() + ".pop()"); this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notify(); index--; return productbox[index]; } } class Producer implements Runnable { ProductBox productbox = null; public Producer(ProductBox productbox) { super(); this.productbox = productbox; } public void run() { for (int i = 0; i < 10; i++) { Product p = new Product(i); productbox.push(p); System.out.println("++produce:" + p); try { Thread.sleep((int) (Math.random() * 200)); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Consumer implements Runnable { ProductBox productbox = null; public Consumer(ProductBox productbox) { super(); this.productbox = productbox; } public void run() { for (int i = 0; i < 10; i++) { Product p = productbox.pop(); System.out.println("--consume:" + p); try { Thread.sleep((int) (Math.random() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } } } }