package study.java.thread.lock; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TestLockCondition { // private LinkedList<Object> myList = new LinkedList<Object>(); private Queue<Object> myList = new ConcurrentLinkedQueue<Object>(); private int MAX = 10; private final Lock lock = new ReentrantLock(); private final Condition full = lock.newCondition(); private final Condition empty = lock.newCondition(); public TestLockCondition() { } public void start() { new Producer().start(); new Consumer().start(); } public static void main(String[] args) throws Exception { TestLockCondition s2 = new TestLockCondition(); s2.start(); } class Producer extends Thread { public void run() { while (true) { /*try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); }*/ lock.lock(); try { while (myList.size() == MAX) { System.out.println("warning: it's full!"); full.await(); } Object o = new Object(); myList.add(o) ; System.out.println("Producer: " + o); empty.signal(); } catch (InterruptedException ie) { System.out.println("producer is interrupted!"); } finally { lock.unlock(); } } } } class Consumer extends Thread { public void run() { while (true) { lock.lock(); try { while (myList.size() == 0) { System.out.println("warning: it's empty!"); empty.await(); } Object o = myList.poll(); System.out.println("Consumer: " + o); full.signal(); } catch (InterruptedException ie) { System.out.println("consumer is interrupted!"); } finally { lock.unlock(); } } } } }