import java.util.concurrent.*; import java.util.*; public class ConsumerProducer { public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); executor.execute(new Consumer()); executor.execute(new Producer()); executor.shutdown(); } private static Semaphore mutex = new Semaphore(1); private static Semaphore full = new Semaphore(0); private static Semaphore empty = new Semaphore(20); private static LinkedList<Integer> q = new LinkedList<Integer>(); private static class Consumer implements Runnable { public void run() { try { while ( true ) { full.acquire(); mutex.acquire(); System.out.println("consume " + q.remove() ); mutex.release(); empty.release(); Thread.sleep((int)(Math.random() * 1000)); } } catch( InterruptedException ex ) { ex.printStackTrace(); } } } private static class Producer implements Runnable { public void run() { try { while ( true ) { empty.acquire(); mutex.acquire(); int data = (int)(Math.random() * 1000); q.offer(data); System.out.println("\t\t\t\tproduce " + data); mutex.release(); full.release(); Thread.sleep((int)(Math.random() * 1000)); } } catch( InterruptedException ex ) { ex.printStackTrace(); } } } }