package examples; import java.util.concurrent.locks.*; public class ex49c { public static void main(String[] args) { DataItem item = new DataItem(0); Producer producer = new Producer(item); Consumer consumer = new Consumer(item); producer.start(); consumer.start(); } public static class DataItem { private int data; private boolean available = false; private Lock lock; private Condition cond; public DataItem(int num) { data = num; lock = new ReentrantLock(); cond = lock.newCondition(); } public void put(int item) { lock.lock(); try { while(available) try{cond.await();}catch(InterruptedException ie){} data = item; available = true; cond.signalAll(); } finally { lock.unlock(); } } public int get() { int temp; lock.lock(); try { while(!available) try{cond.await();}catch(InterruptedException ie){} available = false; temp = data; cond.signalAll(); } finally { lock.unlock(); } return temp; } } public static class Producer extends Thread { private DataItem item; public Producer(DataItem dataItem) { item = dataItem; } public void run() { for (int i = 0; i < 10; i++) { item.put(i); System.out.println("Producer: put: " + i); try {sleep((int) (Math.random() * 100));} catch (InterruptedException ie){} } } } public static class Consumer extends Thread { private DataItem item; public Consumer(DataItem dataItem) { item = dataItem; } public void run() { int value; for (int i = 0; i < 10; i++) { value = item.get(); System.out.println("Consumer: got: " + value); try { sleep((int) (Math.random() * 100)); } catch (InterruptedException ie) { } } } } }